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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章