题意:求一个柱形图中的矩形最大面积
做法:唉,DP,线段树想了一大堆...还是看了大神,回归源头,迭代啊。就是求出每个矩形向左向右最远可以到的地方。这些矩阵里面有一个传递关系,如果a可以到达b,那么a可以到达b可以到达的所有地方
#include<cstdio>
#include<cstring>
#define LL long long
const int LMT=100005;
int h[LMT],l[LMT],r[LMT];
int n;
LL ans;
LL max(LL a,LL b)
{
return a>b?a:b;
}
void init(void)
{
int i;
h[0]=-1;h[n+1]=-1;
for(i=0;i<LMT;i++)l[i]=r[i]=l[i]=i;
ans=0;
}
int main(void)
{
int i,j;
while(~scanf("%d",&n)&&n)
{
init();
for(i=1;i<=n;i++)scanf("%d",&h[i]);
for(i=2;i<=n;i++)
{
j=i;
while(h[i]<=h[l[j]-1])j=l[j]-1;
l[i]=l[j];
}
for(i=n-1;i>0;i--)
{
j=i;
while(h[i]<=h[r[j]+1])j=r[j]+1;
r[i]=r[j];
}
for(i=1;i<=n;i++)
ans=max(ans,(LL)(r[i]-l[i]+1)*h[i]);
printf("%lld\n",ans);
}
return 0;
}