问题描述:给你一个直方图,给出各个矩形的高度,计算在公共基线上对齐的柱状图中最大矩形的面积。
问题分析:利用动态规划的方法,对于位置i,如果左边条形矩形的高度大于它本身,那么左边的左边界一定也满足位置i的左边界。同理如果右边条形矩形的高度大于它本身,那么右边的右边界也一定满足位置i的右边界。迭代循环下去。直到找到i的左右边界。
#include<iostream>
using namespace std;
const int maxn = 100010;
typedef long long ll;
ll s[maxn];
//ll dp[maxn];
int l[maxn], r[maxn];
int n;
int main()
{
while (cin >> n && n)
{
for (int i = 1; i <= n; i++)
{
cin >> s[i];
l[i] = r[i] = i;
}
l[0] = 1;
r[n + 1] = n ;
s[0] = -1;
s[n + 1] = -1;
for (int i = 1; i <= n; i++)
{
while ( s[l[i] - 1] >= s[i])//想了半天,这样做可以大大缩短时间,不用一个个比较
{
l[i] = l[l[i] - 1];
}
}
for (int i = n; i >= 1; i--)//反方向过来也是同样
{
while ( s[r[i] + 1] >= s[i])
{
r[i] = r[r[i] + 1];
}
}
ll max = 0;
for (int i = 1; i <= n; i++)
{
if (s[i] * (r[i] - l[i] + 1) > max)
max = s[i] * (r[i] - l[i] + 1);
}
cout << max << endl;
}
}