HDU1506 Largest Rectangle in a Histogram

题意:计算连续的块的最大面积

开始没看清数据范围,直接暴力很自然的TLE了。。。

#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#define N 1000009
using namespace std;
__int64 a[N];
__int64 dp[100009];//前i个位置的最大面积
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)break;

        memset(a,0,sizeof a);
        for(int i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
        memset(dp,0,sizeof(dp));

        for(int i=1;i<=n;i++)
        {
            __int64 t=1;
            for(int j=i-1;j>=1;j--)
            if(a[j]>=a[i])t++;
            else break;

                for(int j=i+1;j<=n;j++)
                if(a[j]>=a[i])
                  t++;
                  else break;

                dp[i]=a[i]*t;
        }
        __int64 ans=0;
        for(int i=1;i<=n;i++)
        //cout<<dp[i]<<" ";
        ans=max(ans,dp[i]);
        printf("%I64d\n",ans);
    }
    return 0;
}

看了下别人代码,记录左边和右边满足条件的位置,然后求出左右距离就可以求出面积

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define LL long long
#define maxn 100010
using namespace std;
LL a[maxn],dp[maxn];
LL le[maxn],ri[maxn];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        for(int i=1;i<=n;i++)
        scanf("%I64d",&a[i]);

        le[1]=1;ri[n]=n;
        for(int i=2;i<=n;i++)
        {
            int tt=i;
            while(tt>1&&a[i]<=a[tt-1]) tt=le[tt-1];
            le[i]=tt;
        }
        for(int i=n-1;i>=1;i--)
        {
            int tt=i;
            while(tt<n&&a[i]<=a[tt+1]) tt=ri[tt+1];
            ri[i]=tt;
        }
        LL ans=0;
        for(int i=1;i<=n;i++)
        {
            ans=max(ans,(ri[i]-le[i]+1)*a[i]);
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(HDU1506 Largest Rectangle in a Histogram)