題意:給出底爲1,高度不同的一些矩形,求構成的最大的矩形面積
分析:對每個小矩形的高度往兩邊推,找到大於等於其高度的最左和最右2個矩形的下標,最右-最左+1即爲該高度的矩形的寬,乘高度求面積
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define LL __int64
#define N 100005
using namespace std;
LL num[N],a[N],dpl[N],dpr[N];
int main()
{
LL t,n,i,ans;
while(~scanf("%I64d",&n),n){
for(i=1;i<=n;i++)
scanf("%I64d",&a[i]);
memset(dpl,0,sizeof(dpl));
memset(dpr,0,sizeof(dpr));
dpl[1]=1;
dpr[n]=n;
for(i=2;i<=n;i++){
t=i;
while(t>1&&a[i]<=a[t-1])t=dpl[t-1];
dpl[i]=t;
}
for(i=n-1;i>0;i--){
t=i;
while(t<n&&a[i]<=a[t+1])t=dpr[t+1];
dpr[i]=t;
}
ans=0;
for(i=1;i<=n;i++){
if((dpr[i]-dpl[i]+1)*a[i]>ans){
ans=(dpr[i]-dpl[i]+1)*a[i];
}
}
printf("%I64d\n",ans);
}
return 0;
}