HDU 1506

題意:給出底爲1,高度不同的一些矩形,求構成的最大的矩形面積

分析:對每個小矩形的高度往兩邊推,找到大於等於其高度的最左和最右2個矩形的下標,最右-最左+1即爲該高度的矩形的寬,乘高度求面積


#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define LL __int64
#define N 100005
using namespace std;
LL num[N],a[N],dpl[N],dpr[N];
int main()
{
    LL t,n,i,ans;
    while(~scanf("%I64d",&n),n){
        for(i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
        memset(dpl,0,sizeof(dpl));
        memset(dpr,0,sizeof(dpr));
        dpl[1]=1;
        dpr[n]=n;
        for(i=2;i<=n;i++){
            t=i;
            while(t>1&&a[i]<=a[t-1])t=dpl[t-1];
            dpl[i]=t;
        }
        for(i=n-1;i>0;i--){
            t=i;
            while(t<n&&a[i]<=a[t+1])t=dpr[t+1];
            dpr[i]=t;
        }
        ans=0;
        for(i=1;i<=n;i++){
            if((dpr[i]-dpl[i]+1)*a[i]>ans){
                ans=(dpr[i]-dpl[i]+1)*a[i];
            }
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


發佈了104 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章