HDU 1506 Largest Rectangle in a Histogram(最大连续矩阵面积)

Sample Input

7 2 1 4 5 1 3 3

4 1000 1000 1000 1000

0

 

 

Sample Output

8

4000


分析:我们要求最大矩形面积,那么我们应该求每个矩形向两边延伸的最大长度,最坏情况为0(n),必然TLE,那么我们可以应该DP的思想,用一个数组来保存一些结果。例如,dpl【i】表示从左边过来的最长,那么我们计算dpl【i】的时候,如果左边的比自己高,那么dpl【i】=dpl【i-1】,但是可能在前面还有更多符合情况的(比i-1低但是比i高),所以我们要用i-1-dp【i-1】

#include
#include
#include
#include
using namespace std;
#define ll __int64
ll dp[100010],l[100010],r[100010];
ll n;
int main()
{
    while(~scanf("%I64d",&n)&&n)
    {
        int i;
        for(i=1;i<=n;i++)
        {scanf("%I64d",&dp[i]);l[i]=r[i]=1;}
        ll t;
        for(i=2;i<=n;i++)
        {
            t=i-1;
            while(dp[t]>=dp[i]&&t>=1)
            {
                l[i]+=l[t];
                t=t-l[t];
            }
        }
        for(i=n-1;i>=1;i--)
        {
            t=i+1;
            while(dp[t]>=dp[i]&&t<=n)
            {
                r[i]+=r[t];
                t=t+r[t];
            }
        }
        ll ans=0;
        for(i=1;i<=n;i++)
        {
            t=dp[i]*(l[i]+r[i]-1);
            if(ans




你可能感兴趣的:(动态规划)