void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一组巨型的高度,问能组成的最大矩形面积是多少

策略是首先往右边扫描,记录l[i]为大于第i个高度的最后一个序号

然后往右边扫描,记录r[i]是往右边去大于第i个高度的最后一个序号,这样再进行下一个搜索的时候可以省时

类似于之前一道 who is front of me的题

#include<iostream> 
using namespace std; 
int l[100002],r[100002]; 
long h[100002]; 
int main() 
{ int n,i,j; long long max,p; 
while(scanf("%d",&n),n) 
{ for(i=1;i<=n;i++) 
scanf("%ld",&h[i]); 
h[0]=-1; 
for(i=1;i<=n;i++) //找左边界 
{ j=i-1; 
while(h[i]<=h[j]) j=l[j]; l[i]=j; } 
h[n+1]=-1; 
for(i=n;i>0;i--) //找右边界 
{ j=i+1; while(h[i]<=h[j]) j=r[j]; r[i]=j; } 
max=0; for(i=1;i<=n;i++) 
{ p=(long long)(r[i]-l[i]-1)*h[i]; 
max=p>max?p:max; } printf("%lld\n",max); 
}
 return 0; }
posted on 2011-04-21 13:30  void-man  阅读(224)  评论(0)    收藏  举报