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

题目链接:点击打开链接

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

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

// POJ 2559 Largest Rectangle in a Histogram 运行/限制:204ms/1000ms
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct node {
	long long width, height;
	node(long long a,long long b):width(a),height(b){}
};
stack 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;
}


你可能感兴趣的:(单调栈/单调队列,POJ)