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

来源:互联网 发布:linux修改ip配置文件 编辑:程序博客网 时间:2024/05/16 17:40

题目链接:点击打开链接

题意:从左到右排列有多个矩形,这些矩形的宽度都为1,长度不等。选择连续的一至多个矩形,使得到的面积最大,但不能超出原有矩形的范围。

思路:单调栈入门题目,维护一个由栈顶到栈底单调递减(指矩阵高度)的矩阵序列。新矩阵入栈时,若高度大于栈顶矩阵的高度,直接入栈;否则,先更新栈内矩阵,再入栈,具体更新过程为:先取栈顶元素,然后每次从栈顶取一个矩阵,与之前的矩阵进行合并,更新合并矩阵的宽度和高度,同时更新最大面积,直到当前栈顶矩阵的高度小于要入栈的矩阵高度或者栈空。最后栈为一个单调栈,再进行更新,具体更新过程同上,直到栈为空。

// POJ 2559 Largest Rectangle in a Histogram 运行/限制:204ms/1000ms#include <cstdio>#include <cstring>#include <stack>#include <algorithm>#include <iostream>using namespace std;struct node {long long width, height;node(long long a,long long b):width(a),height(b){}};stack<node> s;int main(){int n;long long he, wi;//中间过程的高度,宽度long long re;//最大面积while (scanf("%d", &n) != EOF && n) {re = 0;while (!s.empty()) {//先清空栈s.pop();}for (int i = 0; i < n; i++) {//依次读取n个矩阵scanf("%I64d", &he);wi = 0;while (!s.empty() && he <= s.top().height) {//新矩阵高度不大于栈顶元素高度,先更新栈内元素node te = s.top();s.pop();wi += te.width;re = max(re, te.height*wi);}s.push(node(wi + 1, he));}wi = 0;while (!s.empty()) {node te = s.top();s.pop();wi += te.width;re = max(re, te.height*wi);}printf("%I64d\n", re);}    return 0;}


阅读全文
1 0
原创粉丝点击