朴素做法就是 枚举每一个i的高度 为矩形的宽,然后往两边搜索得到最长的矩形 把所有答案比较一遍得到最大的ans
当然,这样做会超时。一个可以优化的地方就是 n次枚举中,有很多次是可以省略掉的,用到了单调栈的思想,就节省掉了不必要的很多遍历。。。从而省时到204ms
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> using namespace std; __int64 max (__int64 a,__int64 b) {return a<b?b:a;} struct node { __int64 l; __int64 r; __int64 h; }; node tm[100005]; __int64 top; __int64 ans; void insert(node tt) { while(top&& tm[top].h>=tt.h) { tm[top-1].r=tm[top].r; tt.l=tm[top].l; node t=tm[top]; ans=max(ans,t.h*(t.r-t.l+1)); top--; } tm[++top]=tt; } int main() { __int64 n,i; while(scanf("%I64d",&n)!=EOF) { if (!n) break; ans=top=0; node tt; for (i=1;i<=n;i++) { scanf("%I64d",&tt.h); tt.l=tt.r=i; insert(tt); } while(top) { tm[top-1].r=tm[top].r; node t=tm[top]; ans=max(ans,t.h*(t.r-t.l+1)); top--; } printf("%I64d\n",ans); } return 0; }