POJ2559--Largest Rectangle in a Histogram(栈)

来源:互联网 发布:vb入门教程 编辑:程序博客网 时间:2024/04/28 21:57

题目大意:有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;}


0 0