直方图中最大的矩形
题目
对于一个坐标 \(i\) 的 高度 \(h_i\) , 如果你想跨过他组建矩形 , 那么后面的高度肯定不会大于 \(h_i\) , 由于后面的高度未知 , 一种更
加优秀的思想是固定一个坐标 \(i\) , 我们从后往前拼凑直到遇到一个高度比它小的 , ( 这里贪心地想 , 高度确定的话 , 宽度尽可能宽)
对于每个高度 \(i\) , 都经历相同的子问题 , 其实就把所有的情况枚举了 , 只每次只枚举了有效状态.
#include
#include
#include
using namespace std;
const int N = 1e5+5 ;
long long ans;
int n , h[N] , q[N] , width[N];
int main()
{
while(1)
{
scanf("%d",&n);
if( !n ) break;
ans = 0;
for(int i=1;i<=n;++i)
scanf("%d",&h[i]);
int r = 0;
h[n+1] = 0 , q[0] = 0 , width[0] = 0;
for(int i=1;i<=n+1;++i)
{
int w = 0;
while(q[r] > h[i])
{
w += width[r];
ans = max(ans , (long long)w*q[r]);
--r;
}
q[++r] = h[i] , width[r] = w+1;
}
printf("%lld\n",ans);
}
return 0;
}