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 ...
随机推荐
- 【JavaWeb】Filter 过滤器
Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...
- AvaloniaUI体验
公司的原有的PC端WPF产品有跨平台需求,无奈微软自己的xamarin对wpf的支持当前尚未达到能支撑产品的成熟度,于是经过搜索,发现了一个号称用WPF实现跨平台的第三方图形库AvaloniaUI. ...
- Java 使用URL类通过url下载网络资源
主要用到的类 地址类: URL http类: HttpURLConnection 输入流: InputStream 输出流: FileOutputStream 上代码 package com.demo ...
- Can't locate CPAN.pm in @INC
[root@test]# perl -MCPAN -e 'install DBD::mysql'Can't locate CPAN.pm in @INC (@INC contains: /usr/lo ...
- 【Linux】快速创建文件的命令方法
[root@centos7 dir1]# ll total 0 -rw-r--r-- 1 root root 0 Aug 15 02:39 file1 -rw-r--r-- 1 root root 0 ...
- 深入理解Redis之简单动态字符串
目录 SDS SDS与C字符串的区别 SDS获取字符串长度复杂度为O(1),C字符串为O(N) SDS杜绝了缓存区溢出 减少修改字符串时带来的内存重分配次数 二进制安全 Redis没有直接使用C语言传 ...
- C语言中左值和右值的区别(C语言学习笔记)
重要的内容要重复强调: C语言的术语Ivalue指用于识别或定位一个存储位置的标识符.( 注意:左值同时还必须是可改变的) 其实rvalue的发明完全是为了搭配lvalue , rvalue你可以理解 ...
- SpringCloud Alibaba Nacos注册中心源码浅析
一.前置了解 1.1 简介 Nacos是一款阿里巴巴推出的一款微服务发现.配置管理框架.我们本次对将对它的服务注册发现功能进行简单源码分析. 1.2 流程 Nacos的分析分为两部分,一部分是我们的客 ...
- 什么是STP
简介 了解STP 配置STP 相关信息 简介 STP(Spanning Tree Protocol)是运行在交换机上的二层破环协议,环路会导致广播风暴.MAC地址表震荡等后果,STP的主要目的就是确保 ...
- 手把手做一个基于vue-cli的组件库(下篇)
基于vue-cli4的ui组件库,上篇:如何做一个初步的组件.下篇:编写说明文档及页面优化.接上篇,开工. GitHub源码地址:https://github.com/sq-github/sq-ui ...