我们要求最大矩形面积,那么我们应该求每个矩形向两边延伸的最大长度,最坏情况为0(n),必然TLE,那么我们可以应该DP的思想,用一个数组来保存一些结果。
例如,dpl【i】表示从左边过来的最长,那么我们计算dpl【i】的时候,如果左边的比自己高,那么dpl【i】=dpl【i-1】,但是可能在前面还有更多符合情况的(比i-1低但是比i高),所以我们要用i-1-dp【i-1】,继续寻找,详情看代码
#include<iostream>
#include<string.h>
#define LL long long
using namespace std;
const int maxn=100010;
int dpl[maxn],dpr[maxn];
LL height[maxn];
int main()
{
LL ans;
int i,j,n;
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
{
scanf("%d",&height[i]);
dpl[i]=dpr[i]=1;
}
for(i=2;i<=n;i++)
{
int s=i-1;
while(height[i]<=height[s]&&s>=1)
{
dpl[i]+=dpl[s];
s=s-dpl[s];//继续寻找
}
}
for(i=n-1;i>=1;i--)
{
int s=i+1;
while(height[i]<=height[s]&&s<=n)
{
dpr[i]+=dpr[s];
s=s+dpr[s];
}
}
ans=0;
for(i=1;i<=n;i++)
{
LL temp=(height[i]*(dpl[i]+dpr[i]-1));
if(ans<temp) ans=temp;
}
cout<<ans<<endl;
}
return 0;
}