HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)
单调栈和队列讲解:传送门
HDU -1506题意:
就是给你一些矩形的高度,让你统计由这些矩形构成的那个矩形面积最大

如上图所示,如果题目给出的全部是递增的,那么就可以用贪心来解决
从左向右依次让每一个矩形的高度当作最后的高度,来从中选取最大值就可以了
但是如果它不是递增的,中间会出现低谷,那么要还想运用贪心策略就要把之前高度大于它的全部扔掉,但是再扔掉他们之前还要判断一下以他们为最后答案的高度可不可行,这样我们就是在构造一个递增序列,可以用栈来维护它
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<queue>
5 #include<algorithm>
6 #include<vector>
7 #include<stack>
8 using namespace std;
9 const int maxn=100080;
10 int n,height[maxn],width[maxn],Stack[maxn],top=0;
11 long long work()
12 {
13 long long ans=0;
14 for(int i=1;i<=n+1;++i)
15 {
16 if(height[i]>Stack[top])
17 {
18 Stack[++top]=height[i];
19 width[top]=1;
20 }
21 else
22 {
23 int widthsum=0;
24 while(Stack[top]>height[i])
25 {
26 widthsum+=width[top];
27 ans=max(ans,(long long)widthsum*Stack[top]);
28 top--;
29 }
30 Stack[++top]=height[i];
31 width[top]=widthsum+1;
32 }
33 }
34 return ans;
35 }
36 int main()
37 {
38 while(~scanf("%d",&n))
39 {
40 if(!n) break;
41 for(int i=1;i<=n;++i)
42 scanf("%d",&height[i]);
43 height[n+1]=0;
44 long long ans=work();
45 printf("%lld\n",ans);
46 }
47 return 0;
48 }
传送门:51nod 1158
51nod 1158题意:
就是给你输入一个n行m列的矩形,里面由1或0构成,你要从中找出来最大的被1填充的矩形
题解:
这一道题感觉和上一个道题很相似,唯一不同的是,上一道题告诉你了高度,但是这一道题要求你自己找出来
思路:第一步还是降维操作,用a[i][j]记录以第i行为底的全1直方图的高,如对于矩阵:
1 1 1 0
0 0 1 1
1 1 0 1
1 1 1 0
对于上面这个我们可以把它转化成
1 1 1 0
0 0 2 1
1 1 0 2
2 2 1 0
这样处理后就和上一道题差不多了,因为每一行就相当于上一道题输入的那一行数据,我们只需要对这几行一一用单调栈处理就可以了
代码:
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 const int N = 1e5 + 7;
6
7 int n, m, x, ans;
8
9 int h[N], a[N];
10
11 stack <int> s;
12
13 int main()
14
15 {
16
17 scanf("%d%d",&m,&n);
18
19 for(int i = 0; i < m; i++)
20
21 {
22
23 for(int j = 1; j <= n; j++)
24
25 {
26
27 scanf("%d", &x);
28
29 if(x == 1) a[j] += 1;
30
31 else a[j] = 0;
32
33 h[j] = a[j];
34
35 }
36
37 s.push(0);
38
39 for(int j = 1; j <= n + 1; j++)
40
41 {
42
43 while(h[j] < h[s.top()])
44
45 {
46
47 int index = s.top();
48
49 s.pop();
50
51 int tmp = (j - 1 - s.top()) * h[index];//因为我们维护的是一个递增
52 //序列,所以目前正在枚举这个位置,跟栈顶中位置之间的全部位置的高度
53 //都是大于这个正在枚举的位置的高度
54 ans = max(ans, tmp);
55
56 }
57
58 s.push(j);
59
60 }
61
62 }
63
64 cout << ans << endl;
65
66 }
HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)的更多相关文章
- 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))
前置问题:51nod 1102 面积最大的矩形 附上链接: 51nod 1102 面积最大的矩形 这题的题解博客 需要了解的知识:单调栈,在前置问题中已经讲解. 解题思路 对每行求左边连续1的个数,得 ...
- HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)
E - Largest Rectangle in a Histogram Time Limit:1000MS Memory Limit:32768KB 64bit IO Format: ...
- HDU 1506 Largest Rectangle in a Histogram set+二分
Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...
- hdu 1506 Largest Rectangle in a Histogram 构造
题目链接:HDU - 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...
- HDU 1506 Largest Rectangle in a Histogram(区间DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目: Largest Rectangle in a Histogram Time Limit: ...
- 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 ...
- Hdu 1506 Largest Rectangle in a Histogram 分类: Brush Mode 2014-10-28 19:16 93人阅读 评论(0) 收藏
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- hdu 1506 Largest Rectangle in a Histogram(单调栈)
L ...
- HDU 1506 Largest Rectangle in a Histogram(DP)
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
随机推荐
- C中的dll 、lib和exe文件
参考:链接1 链接2 DLL 动态链接库(Dynamic Link Library,缩写为DLL),运行时加载是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.动态链接 ...
- 利用css和jquery制成弹幕
1.首先上图看下效果 2.废话不多说,直接上代码 1>html代码 <div class="barrage"> <div class="scree ...
- windows下使用mingw和msvc静态编译Qt5.15.xx
windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...
- [Noip模拟题]Seq
题目描述 由于hyf长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载.有一群MM排队看hyf.每个MM都有自己独特的风格,由于hyf有着一颗包容的心,所以,什么风格的MM他都喜欢-- ...
- 2V升5V的升压芯片,两款芯片电路图
2V的输入电压,是可以用来做5V输出的升压电路,但是2V的供电设备很少,不知道还有什么东西是2V电压的,还需要升压到5V的电路系统. 两款2V升5V的芯片电路图: 第1, PW5100升压芯片,输出电 ...
- 前端面试准备笔记之JavaScript(02)
01. this的典型应用场景 this在各个场景中取什么值,是在函数执行的时候确认的,不是在定义的时候确认的. 普通函数执行 返回window function fn1() { console.lo ...
- 云原生流水线 Argo Workflow 的安装、使用以及个人体验
注意:这篇文章并不是一篇入门教程,学习 Argo Workflow 请移步官方文档 Argo Documentation Argo Workflow 是一个云原生工作流引擎,专注于编排并行任务.它的特 ...
- selenium元素等待的三种方法
1.强制等待sleep() 使用方法:sleep(X),等待X秒后,进行下一步操作. 使用最简单的一种办法就是强制等待sleep(X),强制让浏览器等待X秒,不管当前操作是否完成,是否可以进行下一步操 ...
- RVA与FOA的转换
主要取决于文件对齐与内存对齐的值
- unstable sort
$sort (aggregation) - MongoDB Manual https://docs.mongodb.com/manual/reference/operator/aggregation/ ...