HDU1506 / POJ2339 Largest Rectangle in a Histogram 单调递减栈
1.什么是单调栈
- 具有单调性和栈的性质
- 单调递减栈就是从栈底到栈顶是单调递减的
- 单调递增栈就是从栈底到栈顶是单调递增的
2.单调栈解决的问题
- 以自己为最小值,找到最长的区间;单调递增栈
- 以自己为最大值,找到最长的区间;单调递减栈
- 给定一个区间找到这个区间的最大值或最小值
3.单调递减栈的性质
- 对于第一个出栈的元素,它的右宽一定为0
- 对于第二个出栈的元素,它的右宽为第一个出栈元素的总宽
- 对于第三个出栈的元素,它的右宽为第二个出栈元素的总宽
- 。。。。。。。。
- 直到栈顶元素小于自己,才可以入栈;
- 入栈元素的左宽为上次出栈元素的总宽+1(自身);若无出栈元素,则左宽为1(自身)
- 最后将栈中所有元素出栈,考虑所有情况
(左宽就是左边比自己小的元素个数,右宽就是右边比自己小的元素的个数)
4.以下面数据模拟一下单调递减栈的操作
- 1入栈,无出栈元素,左宽为1;
- 5入栈,无出栈元素,左宽为1;
- 5出栈,第一个出栈右宽为0;
- 4入栈,左宽为上个出栈元素的总宽+1=2;
- 8入栈,无出栈元素,左宽为1;
- 8出栈,第一个出栈,右宽为0;
- 6入栈,左宽为上个出栈的总宽+1;
- 7入栈,无出栈元素,左宽为1;
- 7出栈,第一个出栈,右宽为0;
- 6出栈,第二个出栈,右宽为上个元素的总宽:1;
- 4出栈,第三个出栈,右宽为上个元素的总宽:3;
- 3入栈,左宽为上个出栈的总宽+1:6;
- 3出栈,第一个出栈右宽为0;
- 2入栈,左宽为上一个出栈的总宽+1:7;
- //全部出栈:
- 2出栈,第一个出栈,右宽为0;
- 1出栈,第二个出栈的,右宽为上个出栈的总宽:7;
5. 单调栈的实现
hdu1506(单调递减栈)poj2339,hrbustoj 2326(需long long)
单调递减栈:如果是以各个元素为最大值找到最大区间的话 q[0]=inf, h=inf-1;
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
//int a[maxn];
int q[maxn]={-1};
int w[maxn];//记录左宽,从这个点之前有多少个点的高度大于等于当前点的高度
int main()
{int n,h;while(scanf("%d",&n)&&n){int top=0;ll ans=0;for(int i=1;i<=n+1;i++){if(i!=n+1)scanf("%d",&h);elseh=0;//为了让所有元素出栈if(h>q[top])q[++top]=h,w[top]=1;else{ll cnt=0; //第一个出栈的右宽为0;while(h<=q[top]){ans=max(ans,(w[top]+cnt)*q[top]); //(左宽+右宽)*高度;cnt=cnt+w[top--]; //第(i>1)出栈的右宽为上一个的总宽;}//终于找到比自己小的数字了,可以入栈了,入栈会得到左宽,左宽为上一个出栈元素的总宽+1;q[++top]=h;w[top]=cnt+1;}}printf("%I64d\n",ans);}return 0;
}
//单调栈:从栈顶到栈底单调递减
HDU1506 / POJ2339 Largest Rectangle in a Histogram 单调递减栈相关推荐
- POJ2559 Largest Rectangle in a Histogram(单调栈)
题意: 给出一组矩形的高,求最多能拼成矩形的最大面积,看图就很清楚了. 要点: 还是单调栈,现在有点感觉了,单调栈大概就是能求出当前值左右的比它大或小的数的范围.这题用高度作为单调栈,分别往左右找比当 ...
- poj 2559 Largest Rectangle in a Histogram 栈
// poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...
- HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
你是不是飘了?骚年! Problem Description A histogram is a polygon composed of a sequence of rectangles aligned ...
- Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积
感觉动态规划都是玄妙的很,思维题吧(单调栈思维) 题解:让求最大矩形面积,宽为1,暴力超时 可以发现 当第i-1个比第i个高的时候 比第i-1个高的所有也一定比第i个高 于是可以用到动态规划的 ...
- 【单调栈】Largest Rectangle in a Histogram(luogu-SP1805/poj 2559)
Largest Rectangle in a Histogram luogu-SP1805 poj 2559 题目大意: 有n个并排的矩阵,高度为aia_iai,宽度为1,现在让求包含于这些矩阵的并 ...
- 【Python CheckiO 题解】Largest Rectangle in a Histogram
CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思 ...
- *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)
题干: Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...
- Largest Rectangle in a Histogram HDU - 1506 解题思路 单调栈
原题目 Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a c ...
- hdu 1506 Largest Rectangle in a Histogram 最大矩形
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1506 Largest Rectangle in a Histogram Time Limit: 20 ...
最新文章
- c语言 求sin近似值,用泰勒公式求sin(x)的近似值
- 获取url的hash值
- Winform中使用控件的Dock属性设计窗体布局,使不随窗体缩放而改变
- ASP.NET Aries 入门开发教程4:查询区的下拉配置
- 长春市计算机学校老照片,松江这所学校一百年啦!一组老照片回忆曾经的旧时光…...
- Java寻找最大公约数
- [Golang] string类型和其他类型的值的互转
- django 1.8 官方文档翻译: 2-6-4 数据库访问优化
- java的oracle事务回滚_Oracle事务处理
- 带孩子们做环球旅行的读后感_孩子少言寡语、不爱说话怎么办?家长们可以这样做...
- 在matlab中进行遥感影像地理坐标的相互转换
- Android开发之蓝牙(Bluetooth)---源码目录
- NWT杂事:来公司只喝酒不谈工作
- Windows远程连接Linux虚拟机图形界面
- MapReduce项目案例3——温度统计
- [经验分享] 【统计小百科】你知道AIC准则么?
- [python爬虫] Selenium爬取新浪微博内容及用户信息
- Roman number -- 罗马数字
- 华为ac配置radius认证服务器_华为aaa配置 华为AAA认证典型配置举例 - 网络设备 - 服务器之家...
- 【Turtle表白合集】“海底月是天上月,眼前人是心上人。”余生多喜乐,长平安~(附3款源码)
热门文章
- LibreOJ 数列分块入门
- ThinkPHP5路由图解
- Java枚举enum以及应用:枚举实现单例模式
- 基于visual Studio2013解决C语言竞赛题之1089牛虎过河
- java取主机的网卡物理地址
- java的数组查找算法_java数组、排序算法、查找算法详解
- linux c编程头文件,如何在Linux中找到C编程语言的头文件?
- python里pai_关于python如何调用win32pai操作cmd的方法
- python的语言是什么歌_用python对歌词进行语言分析
- mybatis 时间_开发工具:Mybatis.Plus.插件三种方式的逆向工程