HDU 1506 不会则直方图最大矩形

来源:互联网 发布:战网客户端 mac 编辑:程序博客网 时间:2024/05/26 07:27
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;//#include<algorithm>using namespace std;为了调用库函数max__int64 dp[100005]; //因为高已经很大了乘上底会更大,所以用__int64__int64 h[100005],l[100005],r[100005];int main(){    __int64 n;    while(scanf("%I64d",&n))//注意64位的输出格式    {        if(n==0)            return 0;        memset(dp,0,sizeof(dp));//养成习惯        memset(h,0,sizeof(h));        __int64 i;//注意i为了统一也设置成__int64        for(i=1;i<=n;i++)            scanf("%I64d",&h[i]);        for(i=1;i<=n;i++)//初始化两边可以延展的范围        {            r[i]=i;            l[i]=i;        }        for(i=1;i<=n;i++)//找左极限必须从1开始,保证前面每一个l[i]需要调用的l[i-1,...,1]都是已经设置好的        {            while(h[i]<=h[l[i]-1]&&l[i]>1)//只要不是第一个数,就和前面的数继续比较小于等于就继续向左延伸                l[i]=l[l[i]-1];        }        for(i=n;i>=1;i--)//找右极限必须从n开始,保证r[i]右边的需要调用的r[i+1,...,n]都是已经设置好的        {            while(h[i]<=h[r[i]+1]&&r[i]<n)//只要不是最后一个数,就和前面的数继续比较小于等于就继续向右延伸                r[i]=r[r[i]+1];        }        for(i=1;i<=n;i++)        {            dp[i]=h[i]*(r[i]-l[i]+1);//底需要加1        }        __int64 max=0;        for(i=1;i<=n;i++)            if(max<dp[i])                max=dp[i];//求出组大面积        printf("%I64d\n",max);    }    return 0;}
1 0