动态规划:E - Largest Rectangle in a Histogram(即HDU 1506)

来源:互联网 发布:unity3d spine2d插件 编辑:程序博客网 时间:2024/06/07 11:22
题意就是求出最大矩形的面积。开始觉得好像不需要用DP,然后就直接搞了就T了;然后又优化一下,看看能不能用记忆递归搞定,但是记忆的时候实行不了也以失败告终……委屈后来还是又回到了DP上,感觉这题好像跟DP没关系啊,搞了好久不太会,后面参考了下别人的,才知道向左搜索的时候dpl[i]=dpl[dpl[i]-1]这样做,这就是DP,我好晕……这也叫DP啊!!!真不理解,这不就是一般的解法嘛!!太晕了……刚才和队友们聊天的时候,队友说生活要用DP的思想啊……哭太神了!
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#define mem(a,b) memset(a,b,sizeof(a))typedef long long ll;using namespace std;int h[100005],dpl[100005],dpr[100005];int main(){    int n,i,j;    while(scanf("%d",&n)&&n)    {        for(i=1; i<=n; i++)            scanf("%d",&h[i]);        for(i=1,j=n; i<=n,j>=1; i++,j--)        {            dpl[i]=i;            dpr[j]=j;            while(dpl[i]>1&&h[dpl[i]-1]>=h[i])                dpl[i]=dpl[dpl[i]-1];            while(dpr[j]<n&&h[dpr[j]+1]>=h[j])                dpr[j]=dpr[dpr[j]+1];        }        ll m=-1;        for(i=1; i<=n; i++)            m=max(m,(ll)h[i]*(dpr[i]-dpl[i]+1));        cout<<m<<endl;    }    return 0;}