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

题意就是求出最大矩形的面积。开始觉得好像不需要用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;
}

你可能感兴趣的:(动态规划:E - Largest Rectangle in a Histogram(即HDU 1506))