/*
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

动态规划-直方图最大长方形相关推荐

  1. 描述性统计分析 | 直方图

    1.1 什么是直方图 直方图由一批长方形构成,通过长方形的面积或高度来代表对应组在数据中所占的比例. 类型: (1)频率分布直方图:长方形的面积代表对应组的频数与组距的比 (2)频数分布直方图:高代表 ...

  2. 【读书笔记->统计学】01-02 饼图、条形图、直方图、累计频数图、折线图概念简介

    饼图 大家应该都知道饼图,饼图块的大小表示占总体的比例(频数).下面是一个例子. 频数:"频数"表示在一个特定组,或者说在一个特定区间内的统计对象的数目,类似于数数. 饼图可以帮助 ...

  3. LeetCode 笔记系列 18 Maximal Rectangle [学以致用](最大矩形)

    leetcode之Largest Rectangle in Histogram 标签: leetcode面试题最大矩形堆栈单调队列 2016-07-30 13:47 1325人阅读 评论(0) 收藏  ...

  4. Head First Statistics one 做图规则

    饼图 用于表现各个组(分类)的频数比例,就是要求数据要有特定的组,或者特定的分类. 需注意在比例相接近时就不太好用. 条形图 条形图可分为有垂直条形图与水平条形图,一般情况下用垂直条形图,在坐标轴名较 ...

  5. 谷歌2017面经题集

    发个Google onsite 面经给需要的人. round 1: 国人大哥, 出了道 merge N 个sorted element list的题, 要写成Generic的形式. 第二题是leetc ...

  6. 深入浅出统计学读书笔记

    一.信息图形化 1.垂直条形图更常用.不过,如果类名称太长,水平条形图就有用了–你将有大量空白位置标识每个类的名称. 2.堆积条形图:针对每种游戏,用一条长方形代表这类游戏的满意玩家频数,用另一条长方 ...

  7. 《从零进阶!数据分析的统计基础》-2.描述性统计分析

    目录: 第二章 描述性统计分析 2.1直方图 2.2数据的计量尺度 定类尺度 定序尺度 定距尺度 定比尺度 2.3数据的集中趋势 2.3.1定量数据:平均数 2.3.2顺序数据:中位数和分位数 2.3 ...

  8. 最大长方形 (Maximum Submatrix Largest Rectangle)(涵盖各种求最大矩形题目)

    在这篇文章里,我将探讨几个和求最大长方形相关的题目,并试图说明如何把一些相对复杂的问题化归成简单的易解的问题.这里的最大,可以指长方形内所有元素之各最大,也可以指面积最大. 问题一(最大和子矩阵) : ...

  9. 0x56. 动态规划 - 状态压缩DP(习题详解 × 7)

    目录 Problem A. 最短Hamilton路径 ProblemB. 蒙德里安的梦想 Problem C. Corn Fields Problem D. 小国王 Problem E. 炮兵阵地 P ...

最新文章

  1. mysql建立数据浏览器_一个简单的MySQL数据浏览器
  2. 第六十三期:放下你手里的代码,小心被抓!
  3. Excel快速选择区域
  4. 限流算法-令牌桶算法
  5. 实战 | 对抗外部威胁防护和勒索病毒,大厂怎么做?
  6. 星云的Linux专用学习手册
  7. ueditor常见用法
  8. 使用蒙特卡罗模拟期权定价
  9. web项目对接钉钉扫码登录
  10. 广科计算机专业学费,电子科技大学各专业收费明细表
  11. html5项目改造Vue工程化
  12. 择时 配置 选股 2016-9-12 图形正确
  13. iOS信鸽推送:解决通过账号推送不成功的问题
  14. 华为、OPPO、vivo、小米牵头制定快充协议统一技术
  15. 阿里P8大牛手把手教你!15个经典面试问题及回答思路,全套教学资料
  16. IO、BIO、NIO、AIO
  17. 途家、木鸟、爱彼迎:国内三大主流民宿预订平台测评
  18. mysql建表时插入中文_Mysql新建表,插入中文时报错“Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column”问题...
  19. 今日干货:免费证件照制作软件推荐
  20. android 佳能 打印机,佳能(中国)- 打印机 - 喷墨机丰富功能 - Canon PRINT Inkjet/SELPHY移动打印...

热门文章

  1. java jespa_Jespa实际运用的一点心得
  2. struct结构体初始化3种方法
  3. 由Qt中qApp想到的(这是单例模式么???)
  4. [react] 你有用过React.Fragment吗?说说它有什么用途?
  5. [html] 在主框架下引入的iframe,如果检测这个iframe是否能打开,如果打不开则跳到404页面
  6. [vue] 说说你觉得认为的vue开发规范有哪些?
  7. [css] 说下你对css样式的这几个属性值initial、inherit、unset、revert的理解
  8. 前端学习(2306):react之组件使用
  9. 前端学习(1925)vue之电商管理系统电商系统之美化一层循环的UI结构
  10. 前端学习(1034):jquery插件-全屏滚动