hdu 1506Largest Rectangle in a Histogram

对每个数用动态规划找到最左边的大于等于它的数,找到最右边的大于等于它的数,最后做一次循环得到答案

代码如下

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
__int64 a[100010];
__int64 n;
struct T
{
    __int64 left;
    __int64 right;
    __int64 height;
}d[100010];
int main()
{
    while(scanf("%I64d",&n),n)
    {
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%I64d",&a[i]);
            d[i].left=i;
            d[i].right=i;
            d[i].height=a[i];
        }
        for(i=1;i<n;i++)
        {
            while(a[d[i].left-1]>=a[i])
            {
                d[i].left=d[d[i].left-1].left;
                if(d[i].left-1<0)
                {
                    break;
                }
            }
        }
        for(i=n-2;i>=0;i--)
        {
            while(a[d[i].right+1]>=a[i])
            {
                d[i].right=d[d[i].right+1].right;
                if(d[i].right+1>=n)
                {
                    break;
                }
            }
        }
        __int64 mmax=-1;
        for(i=0;i<n;i++)
        {
            if(a[i]*(d[i].right-d[i].left+1)>mmax)
            {
                mmax=a[i]*(d[i].right-d[i].left+1);
            }
        }
        printf("%I64d\n",mmax);
    }
    return 0;
}
posted @ 2012-08-10 10:26  willzhang  阅读(170)  评论(0编辑  收藏  举报