hdu 1506Largest Rectangle in a Histogram
对每个数用动态规划找到最左边的大于等于它的数,找到最右边的大于等于它的数,最后做一次循环得到答案
代码如下
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> using namespace std; __int64 a[100010]; __int64 n; struct T { __int64 left; __int64 right; __int64 height; }d[100010]; int main() { while(scanf("%I64d",&n),n) { int i; for(i=0;i<n;i++) { scanf("%I64d",&a[i]); d[i].left=i; d[i].right=i; d[i].height=a[i]; } for(i=1;i<n;i++) { while(a[d[i].left-1]>=a[i]) { d[i].left=d[d[i].left-1].left; if(d[i].left-1<0) { break; } } } for(i=n-2;i>=0;i--) { while(a[d[i].right+1]>=a[i]) { d[i].right=d[d[i].right+1].right; if(d[i].right+1>=n) { break; } } } __int64 mmax=-1; for(i=0;i<n;i++) { if(a[i]*(d[i].right-d[i].left+1)>mmax) { mmax=a[i]*(d[i].right-d[i].left+1); } } printf("%I64d\n",mmax); } return 0; }