SP1805 Largest Rectangle in a Histogram
题目链接:###
题意:###
如图所示,在一条水平线上有n个宽为1的矩形,求包含于这些矩形的最大子矩形面积(图中的阴影部分的面积即所求答案)
输入格式:
有多组测试数据,每组数据占一行。输入零时读入结束。
每行开头为一个数字n(1<=n<=100000),接下来在同一行给出n个数字h1h2...hn(0<=hi<=1000000000)表示每个矩形的高度。
输出格式:
对于每组数据,输出最大子矩阵面积,一组数据输出一行。
题目分析:###
一道单调栈的典型例题……
如果矩形高度单增,可以用每个矩形的高度*从这个矩形到最右边的距离得到一个值,然后取最大的就是ans
如果矩形高度不单调,显然因为右边有比这个矩形高度更矮的矩形所以这个矩形的高度并没有什么卵用
这个时候前面那些矩形除了宽度已经没什么用了,记一下宽度果断丢掉(丢的时候记宽度,并乘高度以更新答案),然后这样矩形序列就又单增啦
用单调栈实现,边读边做,每次把比当前矩形高的都弹出来,然后把当前矩形入栈
最后还要仿照之前的做法把剩下的弹出来更新答案,栈空结束算法,输出答案
代码:###
#include<bits/stdc++.h>
#define MAXN (100000+5)
using namespace std;
inline int read(){
int f=1,cnt=0;char c;
c=getchar();
while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
while(isdigit(c)){cnt=cnt*10+c-'0';c=getchar();}
return cnt*f;
}
int sta[MAXN],w[MAXN],x;
int n,top=0;
long long ans=0;
int main(){
while(1){
top=0;ans=0;
n=read();if(n==0)return 0;
sta[0]=0;
for(register int i=1;i<=n;i++)w[i]=sta[i]=0;
for(register int i=1;i<=n;i++){
x=read();
if(x>=sta[top]){
sta[++top]=x;
w[top]=1;
}
else{
int tot=0;
while(sta[top]>x){
tot+=w[top];
ans=max(ans,(long long)tot*sta[top]);
top--;
}
sta[++top]=x;w[top]=tot+1;
}
}
int tot=0;
while(top){
tot+=w[top];
ans=max(ans,(long long)tot*sta[top]);
top--;
}
printf("%lld\n",ans);
// for(register int i=1;i<=n;i++)printf("%d ",sta[i]);
}
return 0;
}
SP1805 Largest Rectangle in a Histogram的更多相关文章
- 【题解】Largest Rectangle in a Histogram [SP1805] [POJ2559]
[题解]Largest Rectangle in a Histogram [SP1805] [POJ2559] [题目描述] 传送: \(Largest\) \(Rectangle\) \(in\) ...
- poj 2559 Largest Rectangle in a Histogram - 单调栈
Largest Rectangle in a Histogram Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19782 ...
- DP专题训练之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 ...
- Largest Rectangle in a Histogram(DP)
Largest Rectangle in a Histogram Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K ...
- 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(HDU1506)
Largest Rectangle in a Histogram HDU1506 一道DP题: 思路:http://blog.csdn.net/qiqijianglu/article/details/ ...
- POJ 2559 Largest Rectangle in a Histogram
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18942 Accepted: 6083 Description A hi ...
- Largest Rectangle in a Histogram
2107: Largest Rectangle in a Histogram Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 777 Solved: 22 ...
- HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)
E - Largest Rectangle in a Histogram Time Limit:1000MS Memory Limit:32768KB 64bit IO Format: ...
随机推荐
- python day- 7 进本数据类型的先关知识点 set集合 深浅拷贝
一.基本数据类型相关知识 1.str. join()函数 关于字符串 a = "我爱北京" b = a.join("真的") 将&q ...
- 链式mapreduce
在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进行reduce,经reduce后的结果可经个经多个按顺序执行的mapper进行后期的处理,这样的Job是不会保存中 ...
- 答案{{index==0 ? '一' : (index==1 ? '二':'三' )}}
答案{{index==0 ? '一' : (index==1 ? '二':'三' )}}
- springboot实现定时任务的两种方式
方式一:在springboot启动类上添加@EnableScheduling注解,然后创建具体的任务类,在方法上添加@Scheduled注解,并指明执行频率即可.如下: @Componentpubli ...
- 移动web开发适配rem
移动的meta标签 <meta name="viewport" content="width=device-width, initial-scale=1,user ...
- mysql无法远程访问
最近使用Navicat for MySQl访问远程mysql数据库,出现报错, 显示“1130 - Host'xxx.xxx.xxx.xxx' is not allowed to connect to ...
- I2S
音频数据传输而制定: Inter—IC Sound : 单线 时钟和数据一条线,时分复用: 标准的I2S总线电缆是由3根串行导线组成的:1根是时分多路复用(简称TDM)数据线:1根是字选择线:1根是时 ...
- Android API中的对话框
Android API中提供了四个Dialog的自定义子类: AlertDialog ProgressDialog DatePackerDialog TimePickerDialog 也可以派生出自己 ...
- lucene 5可以运行的demo
package hello; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.ap ...
- SPOJ:Eagle and Dogs(求树上每个点最远可以走到哪里---树的直径||DP)
Eagle (AKA Mohamed Ahmed) lives in a city consists of n intersections connected by n-1 roads, in a w ...