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