HDU 1506 动态规划(DP) Largest Rectangle in a Histogram

来源:互联网 发布:2016怎么做好淘宝 编辑:程序博客网 时间:2024/06/01 03:58

题目链接: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;}


原创粉丝点击