POJ2559--Largest Rectangle in a Histogram(栈)

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


你可能感兴趣的:(POJ2559--Largest Rectangle in a Histogram(栈))