题意:给出底为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;
}