POJ-2559-Largest Rectangle in a Histogram(栈)

Posted weiyukang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-2559-Largest Rectangle in a Histogram(栈)相关的知识,希望对你有一定的参考价值。

题意: 有n个矩形,宽都是1,然后依次给你每个矩形的高。这n个矩形连在一起,现在让你规划一个矩形出来,使得这个矩形的面积最大

 

思路: 其实这个题一眼看去很难想到用栈来做

那么用栈怎么做呢?

 

假设现在的数据是

5

1 2 3 4 5

那我们栈内的元素为 1 2 3 4 5 

那么area = max (area, s.top() * count);    count 是我们拿出栈内元素的个数

为什么要这样写呢 我们来想 对于5这个东西 它只能被其他矩阵拿去用, 不能拿其他矩阵。  这样 area = 5 * 1

然后pop()一下, 之后栈顶就是4个, 但我们想一下, 4这个东西, 是不是还可以从5里面拿一个4出来  这样 高为4的矩阵 就可以拿两个出来 则area = 4 *2

之后依次

area = 3 * 3

area = 2 * 4

area = 1 * 5

那我们取一个最大的就好了 则 area = 8

 

那现在问题来了 如果这个序列不是生序的呢

n = 5

2 4 4 1 5

最开始 我们让2进栈, 因为后面的4比2大 所以这个2可以去贡献给4

则 栈的元素是 2 4 4

接下来是1

1小于4  那么 我们就要把前面的元素全部更新成1 因为前面的2 4 4 都比1大

然后记录一下 

现在 对于 栈顶 4 我们就是 4 * 1 (虽然前面还有一个4 那如果这个4是5呢?)

然后   4 * 2 弹栈

然后   2 * 3 弹栈

 

其实这样想 2 4 4 他是一个递增的对吧 对于后面的1来说 前面的3个 它最多只能拿高度为1的矩阵 所以说 前面这3个在用完之后 就没用了

就算1后面有一个5 可以要连续的话 5也只能取1对吧~  画图直接画一下就好了

 

那么现在栈里的元素是1 1 1  1 

之后有一个5  5>s.top()

入栈

最后 栈的元素就是 1 1 1 1 5

然后再去按照第一步递增的那种去处理一下。

 

那我们再来看一下这个东西  里面都取了什么矩阵

 

4 * 1  取中间那个矩阵

4 * 2 取第二三个矩阵 每个高度是4

2 * 3 取前三个   每个高度是2

然后 5 * 1 取最后一个  每个高度是5

1 * 2 取第 4  5个矩阵   每个高度是1

1 * 3 取第 3 4 5矩阵  每个高度是1

1 * 4 取第 2  3 4 5 矩阵   每个高度是1

1 * 5 取全部矩阵 每个高度是1

 

然后每次取记录最大的area就好了

 

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <stack>
#include <cmath>
using namespace std;
const int maxn = 100100;
stack<int> s;
int a[maxn];
int main(){
    int n;
    while(cin >> n && n){
        int ans = -1;
        while(!s.empty()){
            s.pop();
        }
        for(int i = 1; i <= n; i++){
            cin >> a[i];
        }
        for(int i = 1; i <= n; i++){
            if(s.empty() || s.top() <= a[i]){
                s.push(a[i]);
            }
            else{
                int num = 0;
                while(!s.empty() && s.top() > a[i]){
                    num++;
                    ans = max(ans , s.top() * num);
                    s.pop();
                }
                num += 1;
                while(num--){
                    s.push(a[i]);
                }
            }
        }
        int num = 1;
        while(!s.empty()){
            ans = max(ans, s.top() * num);
            s.pop();
            num++;
        }
        printf("%d
", ans);
    }
    return 0;
}

 

以上是关于POJ-2559-Largest Rectangle in a Histogram(栈)的主要内容,如果未能解决你的问题,请参考以下文章

POJ2559 Largest Rectangle in a Histogram

(单调栈)poj-2559 Largest Rectangle in a Histogram

POJ.2559Largest Rectangle in a Histogram(单调栈)

POJ.2559Largest Rectangle in a Histogram(单调栈)

POJ 2559 Largest Rectangle in a Histogram(单调栈)

POJ 2559 - Largest Rectangle in a Histogram - [单调栈]