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]=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