HDU1506 Largest Rectangle in a Histogram

来源:互联网 发布:幼儿绘画软件 编辑:程序博客网 时间:2024/06/05 10:21

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

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

#include <iostream>#include<stdio.h>#include<string>#include<cstring>#include<cmath>#define N 1000009using 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 100010using 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;}


0 0