第一周 Largest Rectangle in a Histogram
|
Language:
题目:
Largest Rectangle in a Histogram
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 Sample Output 8 Hint Huge input, scanf is recommended.
Source |
思路:
我们把每个数字都看成一个宽度为1,长度为a[i]的小矩形,我们从左向右遍历每一个小矩形,然后以这个小矩形向左向右扩展,所能向左扩展的最大值(下标)用L[i]记录下来,所能扩张的最大值(下标)用R[i]记录下来,并把所能扩展最大的矩形面积a[i]*(R[i]-L[i])记录下来,每遍历一个小矩形就动态的经行更新最大值,然后最后输出最后的值即可。
便于理解的图文:
1) 刚开始栈中为空,压入下标0;然后当i=1时,2<=1不成立,下标出栈,栈变为空,计算此时面积res=2;

2)高度1,5,6是依次递增的,所以对应下标依次压入栈中;当i=4时,6>2,下标3出栈,所以计算此时的面积res=6,如图:

3)栈顶元素为2,其对应的高度为5>2(此时,还要和下标i=4的高度比较),所以,栈顶元素2出栈,计算面积为res=10;

4)因为栈顶元素为1,其对应的高度为1<2,满足条件,所以,将i入栈,直到i=6(为压入的0);此时栈中的元素为{1,4,5},有一个栈顶元素对应的高度大于i=6对应的高度,所以,5出栈,计算面积为3,其中最大面积为10;

5)栈顶元素为4,其对应高度为2>0,所以,2出栈,计算面积为4,最大面积为10;

6) 此时,栈顶元素为1,对应高度为1>0,所以,1出栈,因为1出栈以后,栈变为空,所以,计算面积的方式有变化,res=height[1]*6=6,最大面积为10。

代码1:(数组)
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
ll a[maxn];
ll L[maxn],R[maxn];
int st[maxn];//栈的大小
int main(){
int n;
while(cin>>n&&n){
int t=;
for(int i = ;i < n;i++)
scanf("%lld",&a[i]);
for(int i=;i<n;i++){
while(t>&&a[st[t-]]>=a[i]) t--;
L[i] = t==?:(st[t-]+);
st[t++] = i;
}
t = ;
for(int i=n-;i>=;i--){
while(t>&&a[st[t-]]>=a[i]) t--;
R[i] =t ==?n:(st[t-]);
st[t++] = i;
}
ll res = ;
for(int i = ;i<n;i++){
res = max(res,a[i]*(R[i]-L[i]));
}
printf("%lld\n",res); }
return ;
}
代码2:(栈)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn = 1e5+;
ll h[maxn];
stack<int> s;
int main(){
int n;
while(cin>>n&&n){
memset(h,,sizeof(h));//每一组数据之前都需要初始化
while(!s.empty()) s.pop();//把栈中的元素清空
for(int i=;i<=n;i++)//i从1开始
scanf("%lld",&h[i]);
ll j=,res=;//h[]数组设为long long 类型后j也必须为long long型
while(j<=n+){//这里因为当j==n+1,是把栈中剩余的元素进行处理,例如样例中四个数全相同的时候还需最后处理一次,才能求出res的值
if(s.empty()||h[s.top()]<=h[j])
s.push(j++);
else{
ll t = s.top();
s.pop();
ll wid = s.empty()?(j-):(j-s.top()-);//这里因为第一个数组下标是从1开始的,所以当栈为空的时候,矩形的宽度必须为j-1
res = max(res,wid*h[t]);
}
}
cout<<res<<endl;
}
return ;
}
j-s.top()-1的含义:是所求矩形的宽,因为wid = L+R;
L = s.top()+1;//最左边的边界
R= j;//最右边的边界
这个栈的思路很巧,就是如果这个数符合栈中元素递增的规则或栈为空,则入栈
否则,就弹栈,这里是一个一个的弹栈操作,每弹出一个元素,就动态的更新res值,j不变,然后一直重复操作,直到栈顶元素<=要放入栈中的元素,那么就入栈
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std; typedef long long ll;
ll h[]; stack<int> s; int main()
{
int n;
while (scanf("%d", &n)&&n) {
memset(h, , sizeof(h));
while(!s.empty()) s.pop();
for (int i = ; i < n; i++) //i从0开始
scanf("%lld", &h[i]); ll j = , res = ;
while (j<=n) {
if (s.empty()||h[s.top()]<=h[j])
s.push(j++);
else {
ll t = s.top(); s.pop();
ll wid = s.empty()?j:(j-s.top()-);
res = max(res, h[t]*wid);
}
}
printf("%lld\n", res);
}
}
第一周 Largest Rectangle in a Histogram的更多相关文章
- poj 2559 Largest Rectangle in a Histogram (单调栈)
http://poj.org/problem?id=2559 Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 6 ...
- POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15831 ...
- hdu 1506 Largest Rectangle in a Histogram(单调栈)
L ...
- Largest Rectangle in a Histogram HDU - 1506 (单调栈)
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...
- po'j2559 Largest Rectangle in a Histogram 单调栈(递增)
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29498 ...
- [POJ 2559]Largest Rectangle in a Histogram 题解(单调栈)
[POJ 2559]Largest Rectangle in a Histogram Description A histogram is a polygon composed of a sequen ...
- Largest Rectangle in a Histogram (最大子矩阵)
hdu 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common base line ...
- NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!
Largest Rectangle in a Histogram 这么经典的题硬是等今天碰到了原题现场懵逼两小时才会去补题.. ...
- [POJ2559&POJ3494] Largest Rectangle in a Histogram&Largest Submatrix of All 1’s 「单调栈」
Largest Rectangle in a Histogram http://poj.org/problem?id=2559 题意:给出若干宽度相同的矩形的高度(条形统计图),求最大子矩形面积 解题 ...
随机推荐
- 2019杭电多校第四场hdu6623 Minimal Power of Prime
Minimal Power of Prime 题目传送门 解题思路 先打\(N^\frac{1}{5}\)内的素数表,对于每一个n,先分解\(N^\frac{1}{5}\)范围内的素数,分解完后n变为 ...
- 【题解】An Easy Problem
题目描述 给定一个正整数N,求最小的.比N大的正整数M,使得M与N的二进制表示中有相同数目的1. 举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表 ...
- Python 如何debug
一.常见错误: 1.漏了末尾的冒号,如 if语句,循环语句,定义函数 2.缩进错误,该缩进的时候没有缩进 3.把英文符号写成中文符号,如: ' ' () , 4.字符串拼接,把字符串和数字拼接一起 ...
- 第一章 Xshell5评估期已过问题
您的Xshell评估期已过.请访问我们的在线商店购买Xshe许可证.产品密钥将通过电子邮件发送给您. 解决方法 一.进入下载网站 https://www.netsarang.com/zh/thank- ...
- python中关于is,=和==的区别
在Python中 '='相当于赋值 '=='相当于等号两边的值相同 is则是表示两边的id,也就是内存地址相同
- Codeforces 1159E 拓扑排序
题意及思路:https://www.cnblogs.com/dd-bond/p/10859864.html 代码: #include <bits/stdc++.h> #define LL ...
- Java常见的开源数据连接池有哪些,并对参数做出简单的说明
(1)DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP. (2)c3p0 c3p ...
- vue 学习七 组件上使用插槽
我们有时候可能会在组件上添加元素,就像下面那样 <template> <div id="a"> <com1> <p>我是渲染的值&l ...
- 友善之臂arm9、 smart210监控版本,烧写系统
第一次接触嵌入式开发,就拿210练手了,第一天折腾,先烧系统. 准备:板子,8GB或者以上的SD卡,网上找下minitools以及系统小红帽,Android或者ubuntu,debian都可以.[ub ...
- Packet for query is too large (1986748 > 1048576). You can change this value on the server by 异常
场景:mybatis动态拼接,批量添加数据,因为数据太多,凭借过多,导致MySql数据库中插入大于1m的数据时,提示该异常. 解决办法:修改mysql的属性 max_allowed_packet即可. ...
