hdu1506 Largest Rectangle in a Histogram (单调栈)
来源:互联网 发布:versions for mac过期 编辑:程序博客网 时间:2024/05/20 20:19
lef[i],rig[i]分别保存第i个矩形向左和向右分别能扩展多远。
以向右扩展为例:
从左向右枚举每一个矩形i,如果高度height[i]大于等于栈顶元素的高度或栈为空,入栈。
若height[i]<s.top().height,依次弹出栈中元素直到height[i]>=s.top().height。则每一次弹出的元素,向右最多能扩展到i。然后将i入栈。
枚举完了之后栈可能非空,则栈中元素一定可以扩展到最右。
最后(lef[i] + rig[i] - 1)*height[i]的最大值即为答案。注意用long long。
代码(140MS,3028K):
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <stack>using namespace std;struct Node{int idx, height;Node(int a, int b) : idx(a), height(b) {}};int n;int height[100005];int lef[100005];int rig[100005];int main() {while (~scanf("%d", &n) && n) {for (int i = 1; i <= n; i++)scanf("%d", &height[i]);stack<Node> sl;stack<Node> sr;for (int i = 1; i <= n; i++) {Node cur = Node(i, height[i]);while (!sr.empty() && sr.top().height > cur.height) {Node t = sr.top();sr.pop();rig[t.idx] = cur.idx - t.idx;}sr.push(cur);}while (!sr.empty()) {Node t = sr.top();sr.pop();rig[t.idx] = n - t.idx + 1;}for (int i = n; i >= 1; i--) {Node cur = Node(i, height[i]);while (!sl.empty() && sl.top().height > cur.height) {Node t = sl.top();sl.pop();lef[t.idx] = t.idx - cur.idx;}sl.push(cur);}while (!sl.empty()) {Node t = sl.top();sl.pop();lef[t.idx] = t.idx;}long long ans = 0;for (int i = 1; i <= n; i++)ans = max(ans, (long long)(rig[i] + lef[i] - 1) * height[i]);cout << ans << endl;}return 0;}
0 0
- hdu1506 Largest Rectangle in a Histogram (单调栈)
- hdu1506---Largest Rectangle in a Histogram(单调栈)
- HDU1506 Largest Rectangle in a Histogram 单调栈
- hdu1506 Largest Rectangle in a Histogram(单调栈)
- 【单调栈】hdu1506 Largest Rectangle in a Histogram ----简单了解单调栈
- hdu1506—Largest Rectangle in a Histogram(dp+单调栈)
- hdu1506 & pku2559 Largest Rectangle in a Histogram
- 【DP】 hdu1506 Largest Rectangle in a Histogram
- hdu1506 Largest Rectangle in a Histogram
- HDU1506--Largest Rectangle in a Histogram
- hdu1506 Largest Rectangle in a Histogram
- HDU1506 ( Largest Rectangle in a Histogram ) [dp]
- HDU1506 Largest Rectangle in a Histogram
- hdu1506 Largest Rectangle in a Histogram (DP)
- [HDU1506]Largest Rectangle in a Histogram[dp]
- HDU1506 Largest Rectangle in a Histogram
- hdu1506 Largest Rectangle in a Histogram
- hdu1506 Largest Rectangle in a Histogram--DP/栈
- 数据挖掘基础知识-矩阵(分解)
- 计算机原理学习 -- 操作系统发展和程序编译
- 《云计算架构技术与实践》连载18:2.4.3 IDC托管云
- OJ刷题之《函数模板--求n个数之和》
- 关于双向链表的理解
- hdu1506 Largest Rectangle in a Histogram (单调栈)
- UI:UIToolBar的使用
- HTTP Live Streaming直播(iOS直播)技术分析与实现
- Android OTA查分包打包方法
- 2014_12_27_topo_related_problems
- 18周oj函数f(m,n)的计算
- javascript实现漏斗案例
- 《云计算架构技术与实践》连载19:2.4.4 企业私有云
- 《云计算架构技术与实践》连载20:2.4.5 大数据分析云