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

题目链接:点击打开链接

题意:从左到右排列有多个矩形,这些矩形的宽度都为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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值