#HDU 1506 dp求最大子矩阵

来源:互联网 发布:angular.js官网 编辑:程序博客网 时间:2024/06/05 08:39

Largest Rectangle in a Histogram

题意:求一列连续柱状图中最大的一个矩阵。
分析:对于每一个柱形(宽度为 1),我们分别向左&向右找到连续的比它高的柱形,用两个数组记录左右的最大值,然后依据 (r-l+1)*h 求出矩阵面积。

代码如下:

#include <algorithm>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <string>#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;#define MAXN 100005ll Left[MAXN],Right[MAXN],Num[MAXN];int main(){    ll n;    while(cin>>n&&n){        memset(Num,0,sizeof(Num));        memset(Left,0,sizeof(Left));        memset(Right,0,sizeof(Right));        for(ll i=1;i<=n;i++){            scanf("%lld",&Num[i]);        }        Left[1]=1;        for(ll i=2;i<=n;i++){            ll j=i;            while(j>1&&Num[i]<=Num[j-1])j=Left[j-1];            Left[i]=j;//zui zuobian        }        Right[n]=n;        for(ll i=n-1;i>=1;i--){            ll j=i;            while(j<n&&Num[i]<=Num[j+1])j=Right[j+1];            Right[i]=j;        }        ll ans=0;        for(ll i=1;i<=n;i++){            if(ans<Num[i]*(Right[i]-Left[i]+1)){                ans=Num[i]*(Right[i]-Left[i]+1);            }        }        printf("%lld\n",ans);    }    return 0;}

JNU-ACM-ICPC
WYC

原创粉丝点击