题目大意:有n个宽为1,高为h1,h2,h3...hn的长方形从左到右依次排列,形成一个柱状图,求最大矩形面积
分析:运用栈来求解。
首先,我们可以得到这样一个事实,假设最大的矩形的两个端点为L[i], R[i],高度为h,
那么端点两边的矩形的高都比这个最大矩形的高h要小。接下来,我们从左到右,依次枚举各个矩形,假设当前矩形的高就是最大矩形
的高,然后就开始求L[i]。从右到左R[i]。这里求解L[i],R[i]就是栈的运用了。
以L[i]为例,当后一个矩形的高小于当前的高,就可以结束循环了,得到L[i],否则将后一个矩形的编号入栈。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 111111;
long long n;
long long h[maxn];
int L[maxn], R[maxn];
long long st[maxn];
int main() {
while(scanf("%lld", &n) && n != 0) {
for(int i = 0; i < n; i++)
scanf("%lld", &h[i]);
int t = 0;
for(int i = 0; i < n; i++) {
while(t > 0 && h[st[t-1]] >= h[i]) t--;
L[i] = t == 0 ? 0 : (st[t-1]+1);
st[t++] = i;
}
t = 0;
for(int i = n-1; i >= 0; i--) {
while(t > 0 && h[st[t-1]] >= h[i]) t--;
R[i] = t == 0 ? n : st[t-1];
st[t++] = i;
}
long long ans = 0;
for(int i = 0; i < n; i++) {
ans = max(ans, (long long)h[i]*(R[i]-L[i]));
}
printf("%lld\n", ans);
}
return 0;
}