题目来源:http://poj.org/problem?id=2559
题目大意:给定一个直方图,求图中最大矩形的面积。
思路:与 http://blog.csdn.net/moon_sky1999/article/details/52944272 中的思路类似,不过此题是一维的,那个题是二维的。
由于矩形面积为底乘以高,那么可枚举所有的高,并找到其最大能够扩展的底,取其中的最大值。
数组l[i]表示第i位的柱可向左扩展的最大位数,也就是从第i-l[i]+1位到第i位的柱均不高于第i位的。r[i]类似。
这样最大矩形面积即为max(h[i]*(l[i]+r[i]-1))。
注意本题要用long long类型的数据。
代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
long long n;
const long long maxn=1e5+10;
long long a[maxn];
long long l[maxn];
long long r[maxn];
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
cin>>n;
while(n)
{
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
{
l[i]=1;
int t=i-1;
while(a[i]<=a[t]&&t>=1)
{
l[i]+=l[t];
t-=l[t];
}
}
for(int i=n;i>=1;i--)
{
r[i]=1;
int t=i+1;
while(a[i]<=a[t]&&t<=n)
{
r[i]+=r[t];
t+=r[t];
}
}
long long tot=0;
for(int i=1;i<=n;i++)
{
tot=max(tot,(r[i]+l[i]-1)*a[i]);
}
cout<<tot<<endl;
cin>>n;
}
return 0;
}