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;
}


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