Largest Rectangle in a Histogram

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 10873    Accepted Submission(s): 2969

Problem Description
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of
rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:


Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned
at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.

 
Input
The input contains several test cases. Each test case describes a histogram and starts with an integer n, denoting the number of rectangles it is composed of. You may assume that 1 <= n <= 100000. Then follow n integers h1, ..., hn,
where 0 <= hi <= 1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is 1. A zero follows the input for the last test case.
 
Output
For each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.
 
Sample Input
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
 
Sample Output
8
4000
 
Source
 
Recommend
LL   |   We have carefully selected several similar problems for you:  1505 

pid=1058" target="_blank">1058 1176 

pid=2870" target="_blank">2870 2571




题目大意:给你一张柱形图,先给你一个N表示柱的数量。然后给你N个高度。每个柱的宽度是1,让你在柱形图中放入一个矩形。要求输出的矩形面积是最大的。



解题思路:矩形的高度一定是那些给出柱的高度中的一个,以一个柱的高度为矩形的高时计算出当前这个高度下最大的矩形面积,枚举每个高度,最后找到那个最大的,

就是 所求。所以题目就变成了在给定高度下找矩形的最大宽度(高度一定找最大面积),那么就要找到当前高度的左右边界,明显仅仅要旁边的柱比这个高度要高就能够再向旁

边扩展一个单位。解题思路给出。

还好这题没出负数数据,要不然就完蛋了。。。

#include <iostream>
using namespace std;
#define M 100005
__int64 l[M],r[M],vis[M]; //数据用int过不去。所以用__int64.
__int64
max(__int64 x,__int64 y){
return
x>y?x:y;
}
int
min(int x,int y){
return
x<y?x:y;
}
__int64
DP(__int64 a[],__int64 n){
__int64
i;
for(
i=1;i<=n;i++) //从左边找左边界,从右边開始找会超时,不解释。 {
while(
a[i]<=a[l[i]-1]) l[i]=l[l[i]-1]; //假设左边的比当前高度高,说明能够向左边扩展。while这里有点递归的味道。
//直到左边比当前高度低,才结束while。 }
for(
i=n;i>=1;i--)
{
while(
a[i]<=a[r[i]+1]) r[i]=r[r[i]+1]; //找右边界的过程和找左边界过程一样。 }
__int64
tot=0;
for(
i=1;i<=n;i++) //每个高度的最大宽度已经找到,计算最大面积。 {
tot=max(tot,(r[i]-l[i]+1)*a[i]); //宽度为1。所以还要+1.
}
return
tot;
} int main(__int64
i,__int64 j,__int64 k)
{
__int64
n,cur;
while(
scanf("%I64d",&n)!=EOF&&n)
{
l[0]=l[n+1]=vis[0]=vis[n+1]=-1; //这里是防一些特殊的数据。按理来说取0就能够了。只是过不了。
 r[n+1]=n;
for(
i=1;i<=n;i++)
{

l[i]=r[i]=i; //l[i]记录的是vis[i]的左边界,r[i]记录vis[i]的右边界。
scanf("%I64d",&vis[i]);
}

cur=DP(vis,n);
printf("%I64d\n",cur);
}
return
0;
}

HDU1506 Largest Rectangle in a Histogram (动规)的更多相关文章

  1. hdu---1506(Largest Rectangle in a Histogram/dp最大子矩阵)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. hdu1506——Largest Rectangle in a Histogram

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  3. hdu1506 Largest Rectangle in a Histogram

    Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a commo ...

  4. NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!

                                         Largest Rectangle in a Histogram 这么经典的题硬是等今天碰到了原题现场懵逼两小时才会去补题.. ...

  5. 【题解】hdu1506 Largest Rectangle in a Histogram

    目录 题目 思路 \(Code\) 题目 Largest Rectangle in a Histogram 思路 单调栈. 不知道怎么描述所以用样例讲一下. 7 2 1 4 5 1 3 3 最大矩形的 ...

  6. HDU-1506 Largest Rectangle in a Histogram【单调栈】

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  7. HDU1506 ( Largest Rectangle in a Histogram ) [dp]

    近期情绪太不稳定了.可能是由于在找实习这个过程碰壁了吧.第一次面试就跪了,可能是我面的是一个新公司,制度不完好,我感觉整个面试过程全然不沾编程,我面试的还是软件开发-后来我同学面试的时候.说是有一道数 ...

  8. 【单调栈】hdu1506 Largest Rectangle in a Histogram

    单调栈的介绍及一些基本性质 http://blog.csdn.net/liujian20150808/article/details/50752861 依次把矩形塞进单调栈,保持其单增,矩形中的元素是 ...

  9. HDU1506 Largest Rectangle in a Histogram(算竞进阶习题)

    单调栈裸题 如果矩形高度从左到右是依次递增,那我们枚举每个矩形高度,宽度拉到最优,计算最大面积即可 当有某个矩形比前一个矩形要矮的时候,这块面积的高度就不能大于他本身,所以之前的所有高于他的矩形多出来 ...

随机推荐

  1. LoadRunner11使用方法以及注意点收集

    一:安装loadrunner http://jingyan.baidu.com/article/f7ff0bfc1cc82c2e26bb13b7.html http://www.cnblogs.com ...

  2. python算法-排列组合

    排列组合 一.递归 1.自己调用自己 2.找到一个退出的条件 二.全排列:针对给定的一组数据,给出包含所有数据的排列的组合 1:1 1,2:[[1,2],[2,1]] 1,2,3:[[1,2,3],[ ...

  3. Selenium WebDriver- 指定页面加载时间

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...

  4. Leetcode 477.汉明距离总和

    汉明距离总和 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中, ...

  5. 面试问题整理Andorid版本 date: 2017-1-12 21:14:36 categories: 技术

    Acitivty的四中启动模式与特点. standard:默认的启动模式 singleTop:适合那种接受通知启动的页面,比如新闻客户端之类的,可能会给你推送好几次 ,但是每次都是打开同一张页面调用o ...

  6. Eclipse常用配置及常用快捷键

    Eclipse常用配置 ① 对编辑窗口视图的字体大小和字体类型进行配置; ②对控制台和xml文本字体大小和字体类型进行设置; ③ 设置.修改eclipse所使用的jdk环境; ④ 设置.修改当前对ja ...

  7. 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功

    记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boo ...

  8. mysql 查询死锁语句

    我们可以用下面三张表来查原因:        innodb_trx ## 当前运行的所有事务        innodb_locks ## 当前出现的锁        innodb_lock_wait ...

  9. 表单编码 appliation/x-www-form-urlencoded 与 multipart/form-data 的区别

    当表单使用POST方法时,表单数据提交到服务器端之前有两种编码类型可供选择.默认编码类型为 application/x-www-form-urlencoded,此时所有非字母数字类型的字符都需要转换为 ...

  10. ace模板dataTables_length控制是否显示分页

    默认的ace中配置的是7列之后才显示分页的,其实是可控的,如下: aoColumns这个参数的含义: 排序控制 $(document).ready(function() {$('#example'). ...