您的位置:首页 > 其它

#HDU 1506 dp求最大子矩阵

2017-07-24 14:27 323 查看
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 0x3f3f3f3f
using namespace std;
typedef long long ll;

#define MAXN 100005
ll 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;
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp