题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
分析:[本题深化版HDU 1505]一开始我用暴力,总是超时.后来才用DP过的.要得到最大的面积,肯定要得到相应的长和高,而高就肯定是n个高度中的某一个,关键是找到长.我们可把每个矩形以本身的高度向两边延伸(左端L右端R)的长度算出为(R-L+1).如果f[i]>f[i-1],则L[i-1]也满足i,即L[i]=L[i-1],进一步如果f[i]>f[L[i]-1],则L[i]=L[L[i]-1].同理,R也有类似的性质.
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=100000+10;
int f[maxn];
int L[maxn],R[maxn];
int main(){
int n;
while(~scanf("%d",&n),n){
for(int i=0;i<n;++i){
scanf("%d",f+i);
L[i]=i;R[i]=i;
}
for(int i=0,j=n-1;i<n;--j,++i){
while(L[i]&&f[L[i]-1]>=f[i])
L[i]=L[L[i]-1];
while(R[j]<n-1&&f[R[j]+1]>=f[j])
R[j]=R[R[j]+1];
}
__int64 ans=0;
for(int i=0;i<n;++i){
__int64 s=(__int64)f[i]*(R[i]-L[i]+1);
ans=max(s,ans);
}
printf("%I64d\n",ans);
}
return 0;
}