动态规划-直方图最大长方形

/*
1017: C03-单调栈算法-最大长方形
时间限制: 1 Sec 内存限制: 128 MB 提交: 17 解决: 10 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述给你一个直方图,告诉你各个条形矩形的高度,求基线对齐构成的矩形中面积最大的矩形的面积。对于每一个矩形,面积 = h[i]*(j-k+1),其中j,k是左右边界,h[i]是矩形的高。并且对于j <= x <= k,h[i] <= h[x]。代码提交链接输入 输入包含几个测试用例。每个测试用例描述一个直方图,并以整数n开始,表示它由多少个矩形组成。你可以假设1 <= n <= 100000。然后按照n个整数h1,…, hn,其中0 <= hi <= 1000000000。这些数字表示直方图中从左到右排列的矩形的高度。每个矩形的宽度是1。0紧跟最后一个测试用例的输入。输出 对于单个行上的每个测试用例输出,指定直方图中最大矩形的面积。记住,这个矩形必须与公共基线对齐。样例输入7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0样例输出8 4000提示我们可以用一个单调栈由低到高来存储它的高度,并用数组对每个高度记录一下它前面(包括它自己)一共有多少个比它高的,可以看做它的左宽。 按顺序考虑每个高度h,如果h大于栈顶元素,则入栈,此时它大于左面全部的元素,并且将它的宽度初始为1。 否则,将栈内元素出栈,直到满足上面的条件。出栈时,我们要将出栈元素对之后问题的影响全部考虑进行处理,才能保证做法的正确性。 对于每个高度,它的作用无非两个:1、以自己作高,向外扩展 2、以别人作高,自己被扩展 由于我们数组中已经记录了某个高度的左宽,所以我们只需要考虑它能不能向右扩展,如果能,能扩展多少? 首先,对于第一个出栈的元素来说,它的右宽一定是0。 然而对于第二个,它的右边有刚才出栈的元素,而且刚才出栈元素的总宽中所涉及的元素一定可以被自己扩展,所以自己的右宽为刚才出栈元素的总宽。 同理可知,第三个出栈元素的右宽为第二个出栈元素的总宽。依次类推。 而当h大于栈顶元素时,h的左宽应该是上次出栈元素的总宽+1(自己),然后入栈。 最后时,将所有元素出栈,即可将所有情况考虑。来源/分类 C03-栈 [提交] [状态]
*/ #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<stack> using namespace std; const int Max_N=100008; struct Elem{int id;//向左扩展最远的下标 long long height;//当前节点高度 Elem(){} //在其他的地方要定义一个Elem类型的变量的时候一定要加 Elem(int _id,long long _height):id(_id),height(_height){} }; int N; long long x[Max_N]; long long Ans(){int i,L_id;long long ans=0;Elem e;stack<Elem> stk;for(i=0;i<=N;i++){L_id=i;while(!stk.empty()&&stk.top().height>x[i]){ans=max(ans,(long long)(i-stk.top().id)*stk.top().height);L_id=stk.top().id;stk.pop();}//由于上面修改了L_id,这里相当于每次加入一个长度为(i-L_id)的长方形//这里枚举一遍找一个最大值就可以了 stk.push(Elem(L_id,x[i]));}return ans; }int main() {int i;while(cin>>N&&N){for(int i=0;i<N;i++)scanf("%lld",&x[i]);x[N]=-1;cout<<Ans()<<endl;}return 0; }/**************************************************************Problem: 1105User: BlingoLanguage: C++Result: 正确Time:36 msMemory:2880 kb ****************************************************************/

 

1105: B10-动态规划:直方图最大长方形

时间限制: 1 Sec  内存限制: 128 MB
提交: 8  解决: 5
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

给你一个直方图,告诉你各个条形矩形的高度,求基线对齐构成的矩形中面积最大的矩形的面积。对于每一个矩形,面积 = h[i]*(j-k+1),其中j,k是左右边界,h[i]是矩形

的高。并且对于j <= x <= k,h[i] <= h[x]。



 

输入

输入包含几个测试用例。每个测试用例描述一个直方图,并以整数n开始,表示它由多少个矩形组成。你可以假设1 <= n <= 100000。然后按照n个整数h1,…, hn,其中0 <= hi <= 1000000000。这些数字表示直方图中从左到右排列的矩形的高度。每个矩形的宽度是1。0紧跟最后一个测试用例的输入。

 

输出

对于单个行上的每个测试用例输出,指定直方图中最大矩形的面积。记住,这个矩形必须与公共基线对齐。

 

样例输入

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

 

样例输出

8
4000

 

提示


我们可以用一个单调栈由低到高来存储它的高度,并用数组对每个高度记录一下它前面(包括它自己)一共有多少个比它高的,可以看做它的左宽。
按顺序考虑每个高度h,如果h大于栈顶元素,则入栈,此时它大于左面全部的元素,并且将它的宽度初始为1。
否则,将栈内元素出栈,直到满足上面的条件。出栈时,我们要将出栈元素对之后问题的影响全部考虑进行处理,才能保证做法的正确性。
对于每个高度,它的作用无非两个:1、以自己作高,向外扩展        2、以别人作高,自己被扩展
由于我们数组中已经记录了某个高度的左宽,所以我们只需要考虑它能不能向右扩展,如果能,能扩展多少?
首先,对于第一个出栈的元素来说,它的右宽一定是0。
然而对于第二个,它的右边有刚才出栈的元素,而且刚才出栈元素的总宽中所涉及的元素一定可以被自己扩展,所以自己的右宽为刚才出栈元素的总宽。
同理可知,第三个出栈元素的右宽为第二个出栈元素的总宽。依次类推。
而当h大于栈顶元素时,h的左宽应该是上次出栈元素的总宽+1(自己),然后入栈。
最后时,将所有元素出栈,即可将所有情况考虑。


 

来源/分类

B10-动态规划 

 

[提交] [状态]

转载于:https://www.cnblogs.com/Tidoblogs/p/11173398.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metropolis Hasting算法

Metropolis Hasting Algorithm: MH算法也是一种基于模拟的MCMC技术&#xff0c;一个很重要的应用是从给定的概率分布中抽样。主要原理是构造了一个精妙的Markov链&#xff0c;使得该链的稳态是你给定的概率密度。它的好处&#xff0c;不用多说&#xff0c;自然是可以对付数学形…

荣耀变鸿蒙系统,鸿蒙系统首批升级机型曝光!荣耀手机遗憾缺席,原因很简单...

原标题&#xff1a;鸿蒙系统首批升级机型曝光&#xff01;荣耀手机遗憾缺席&#xff0c;原因很简单大家好&#xff0c;我是科技君的探讨&#xff0c;欢迎关注我&#xff0c;与我一起进行科技的探讨。华为鸿蒙系统可以说是目前数码圈关注度最高的事件之一了。从早期公布&#xf…

bzoj2733永无乡

永无乡 HYSBZ - 2733 永无乡包含 n 座岛&#xff0c;编号从 1 到 n&#xff0c;每座岛都有自己的独一无二的重要度&#xff0c;按照重要度可 以将这 n 座岛排名&#xff0c;名次用 1 到 n 来表示。某些岛之间由巨大的桥连接&#xff0c;通过桥可以从一个岛 到达另一个岛。如果…

在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8

{相关结构:} TDSFXFlanger packed recordfWetDryMix: Single; // 0 .. 100 : 50 (%)fDepth: Single; // 0 .. 100 : 100 (%)fFeedback: Single; //-99 .. 99 : -50 (%)fFrequency: Single; // 0 .. 10 : 0.25lWaveform: Longint; // 0 .. 1 : 1fDelay: Sin…

html判断是否在页面,html判断当前页面是否在iframe中的实例

html判断当前页面是否在iframe中的实例在做HTML页面的时候&#xff0c;经常会遇到“如果当前页面显示在iframe中&#xff0c;我们就相应的处理”判断方法为&#xff1a;//判断是否在iframe中if(self!top){parent.window.location.replace(window.location.href);}以上这篇html判…

一种用户体验-显示对话框时灰化你的主窗体

袁永福 ( http://www.xdesigner.cn ) 2007&#xff0d;8&#xff0d;10 程序全部源代码下载(工程文件使用VS.NET2003格式):/Files/xdesigner/DisableMask.rar 在一些Web程序中,有一种页面效果,当弹出一个模拟的对话框时,主页面就整体灰化了,其他的元素不能动弹,只有这个对话框能…

html文档中用于表示页面标题的标记对是,汽车发动机拆装与检修实训超星尔雅答案...

摘要&#xff1a;汽车生活事件也称为应激源( )在教师的直接领导下整个班级的学生一起进行的学习&#xff0c;机拆检修称为( )实训教学二字连用最早出自( )...汽车生活事件也称为应激源( )发动下列不属于课程与教学关系观的是( )在教师的直接领导下整个班级的学生一起进行的学习…

H5|web移动前端自适应适配布局解决方案

方案&#xff1a; 固定一个某些宽度&#xff0c;使用一个模式&#xff0c;加上少许的媒体查询方案使用flexbox解决方案使用百分比加媒体查询使用rem1. 简单问题简单解决 我觉得有些web app并一定很复杂&#xff0c;比如拉勾网&#xff0c;你看看它的页面在iphone4,iphone6,ipad…

[转] 用Diff和Patch工具维护源码

在Unix系统下&#xff0c;维护源码版本可以使用很多方法&#xff0c;其中最常用的当然是大名鼎鼎的CVS&#xff0c;但实际上&#xff0c;简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具&#xff0c;Unix标配中的diff和patch工具就完全可以完成代码的简单备份和…

jQuery 结合 Json 提交数据到Webservice,并接收从Webservice返回的Json数据

简单的Json数据提交 jQuery ajax webservice&#xff1a;get 和 post 一、GET 方式客户端代码vardata { classCode: "0001"}; //这里要直接使用JOSN对象$.ajax({ type: "GET", contentType: "application/json; chars…

X86逆向教程10:学会使用硬件断点

本节课我们将学习硬件断点的使用技巧&#xff0c;硬件断点是由硬件提供给我们的一组寄存器&#xff0c;我们可以对这些硬件寄存器设置相应的值&#xff0c;然后让硬件帮我们断在需要下断点的地址上面&#xff0c;这就是硬件断点&#xff0c;硬件断点依赖于寄存器&#xff0c;这…

html 监控键盘,后台监控鼠标和键盘(可监听全局的鼠标以及键盘按键)

资源下载此资源下载价格为3D币&#xff0c;请先登录资源文件列表MouseKeyboardLibrary/MouseKeyboardLibrary/app.config , 134MouseKeyboardLibrary/MouseKeyboardLibrary/bin/Debug/MouseKeyboardLibrary.exe , 23040MouseKeyboardLibrary/MouseKeyboardLibrary/bin/Debug/Mo…

POJ 3258 River Hopscotch

题目链接&#xff1a;https://vjudge.net/problem/POJ-3258 题目大意 给定数轴上一个起点 0&#xff0c;终点 L&#xff0c;以及中间 N 个不同的点&#xff0c;现准备删除中间 N 个点中的 M 个&#xff0c;使得剩下来的点&#xff08;包括起点和终点&#xff09;&#xff0c;相…

2021泉州高考学校成绩查询,2021泉州市地区高考成绩排名查询,泉州市高考各高中成绩喜报榜单...

距离2018年高考还有不到一个月的时间了&#xff0c;很多人在准备最后冲刺的同时&#xff0c;也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布&#xff0c;下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单&#xff0c;想要了解同学可以…

转载:CEO如何“养好CIO同时管好CIO”?

http://www.enet.com.cn/article/2010/1214/A20101214800028.shtml 在现代企业经营理论中&#xff0c;有个着名的“二八定律”&#xff0c;即人才对企业贡献而言&#xff0c;常常是20%的人做出了80%的企业效益。显而易见&#xff0c;这“20%”就是企业的骨干与核心。而这“20%”…

Abraca:XMMS2 的客户端

Toy Posted in AppsRSSTrackback Abraca 是基于 GTK2 而开辟的 XMMS2 音乐播放器的客户端。今后具有播放列表、音乐经管等功用。需留神的是&#xff0c;此法式要求 XMMS2、GTK 2、libglade、libnotify&#xff08;可选&#xff09;、Python 等。- Download Abraca 0.1版权声明&…

pandas plot label_数据科学| 手把手教你用 pandas 索引、汇总、处理缺失数据

作者&#xff1a;Paul编者按&#xff1a; pandas提供了很多常用的数学和统计方法&#xff0c;本文中将用十分详细的例子来具体进行介绍&#xff1b;另外在许多数据分析工作中,缺失数据是经常发生的&#xff0c;将会具体介绍如何处理缺失数据。本文十分详细并实在低介绍了pandas…

2011年三八妇女节搜索引擎LOGO设计欣赏

今天是一年一度的三八国际妇女节&#xff0c;在这个特别的日子&#xff0c;烈火学院向所有女性致以节日的祝福&#xff0c;祝愿每位女同胞节日快乐&#xff0c;工作愉快&#xff01;并送上本期的搜索引擎LOGO设计欣赏&#xff0c;希望大家喜欢&#xff01; 一。百度 有作家曾说…

诺基亚2亿欧元建越南新工场

诺基亚昨天颁布发表将会在越南北部河内左近设立扶植一个新的装配厂&#xff0c;方案于2012年尾投入运用&#xff0c;初期投资达到2亿欧元&#xff0c;约合18.3亿人夷易近币。诺基亚目下当今在世界上拥有10个工场&#xff0c;新厂将会进入到诺基亚的举世制造搜集&#xff0c;为他…

Android 一直往文件写数据_( 十 ) 小众但好用:通过 Google drive 备份与同步 Keepass 数据库...

之前有提到过&#xff0c;keepass 的数据库是加密保存在本地的。而且 keepass 又是多平台免费的密码管理软件。所以如果需要实现 keepass 在多平台读取同一个数据库&#xff0c;我们需要自己搭一个服务器才怪&#xff01;搭服务器太麻烦&#xff0c;还要额外支出费用&#xff0…