HDU - 1506 Largest Rectangle in a Histogram

题意:给你n个木板的长度,且宽度都为1,让你找出最大的矩形区域面积

思路:这道题的关键就是算出每个可能的矩形的面积,而面积的计算方法可以是从一个板开始找出可向左延伸和向右延伸的边界,若左边界为L右边界为R,那么矩阵大小公式就是H[i]*(R-L+1),此时我们需要找到每个板可延伸到的边界。此时用两个数组L[i],R[i]来表示第i个板的左右延伸边界。计算边界的方法为

        for(i=1;i<=n;i++)
        {
            while(a[l[i]-1]>=a[i])
                l[i]=l[l[i]-1];
        }
        for(i=n;i>=1;i--)
        {
            while(a[r[i]+1]>=a[i])
                r[i]=r[r[i]+1];
        }

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

long long l[110000],r[110000],a[110000];
int main()
{
    int n,i;
    while(scanf("%d",&n),n!=0)
    {
        a[0]=-1;
        a[n+1]=-1;
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            r[i]=i;
            l[i]=i;
        }
        for(i=1;i<=n;i++)
        {
            while(a[l[i]-1]>=a[i])
                l[i]=l[l[i]-1];
        }
        for(i=n;i>=1;i--)
        {
            while(a[r[i]+1]>=a[i])
                r[i]=r[r[i]+1];
        }
        long long maxn=0,m;
        for(i=1;i<=n;i++)
        {
            m=a[i]*(r[i]-l[i]+1);
            if(m>maxn)
                maxn=m;
        }
        printf("%lld\n",maxn);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章