单调栈和队列讲解:传送门

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的最大子矩阵 (单调栈)的更多相关文章

  1. 51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))

    前置问题:51nod 1102 面积最大的矩形 附上链接: 51nod 1102 面积最大的矩形 这题的题解博客 需要了解的知识:单调栈,在前置问题中已经讲解. 解题思路 对每行求左边连续1的个数,得 ...

  2. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  3. HDU 1506 Largest Rectangle in a Histogram set+二分

    Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...

  4. 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 ...

  5. HDU 1506 Largest Rectangle in a Histogram(区间DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题目: Largest Rectangle in a Histogram Time Limit: ...

  6. 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 ...

  7. 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 ...

  8. hdu 1506 Largest Rectangle in a Histogram(单调栈)

                                                                                                       L ...

  9. HDU 1506 Largest Rectangle in a Histogram(DP)

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

随机推荐

  1. 【JavaWeb】XML 文件

    XML 文件 简介 XML 是可拓展的标记性语言. XML 的主要作用: 用来保存数据,且这些数据具有自我描述性: 作为项目或模块的配置文件: 作为网络数据传输的格式,但是现在以 JSON 格式为主. ...

  2. MySQL where 条件字句查询

    where 条件字句 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值 逻辑运算符 运算符 语法 描述 and && a and b a && b 逻辑与 两 ...

  3. rm: cannot remove `/tmp/localhost-mysql_cacti_stats.txt': Operation not permitted

    [root@DBslave tmp]# chown zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt

  4. 【Oracle】CBO优化详解

    SQL优化是数据优化的重要方面,本文将分析Oracle自身的CBO优化,即基于成本的优化方法.Oracle为了自动的优化sql语句需要各种统计数据作为优化基础.外面会通过sql的追踪来分析sql的执行 ...

  5. 【Oracle】查看表或视图的创建语句

    这里用到的是Oracle的DDL语句的用法 用于获得某个schema下所有的表.索引.视图.存储过程.函数的DDL set pagesize 0 set long 90000 set feedback ...

  6. 修改主机名后VCS的修改

    转:https://blog.csdn.net/nauwzj/article/details/6733135 一. 单机改主机名需更改以下文件: /etc/hosts /etc/hostname.hm ...

  7. SGA: allocation forcing component growth分析

    1.问题现象 20年12月31日,数据库应用人员反映2020-12-31 12:40:10存在告警,过了几分钟之后业务恢复正常. 表现的状态:Connect to database time out, ...

  8. 1V转3.3V稳压供电的芯片电路图

    1V转3.3V供电是简单的,仅需要一个芯片和三个外围元件即可组成这样的一个1V转3.3V的电路图和升压电路了.可以持续稳定地供电3.3V给模块或者MCU灯电路.让后端工作稳定,同时也能控制电路的功耗. ...

  9. 注入器(injector)

    1.0    注入器/injector 注入器是AngularJS框架实现和应用开发的关键,这是一个DI/IoC容器的实现. AngularJS将功能分成了不同类型的组件分别实现,这些组件有一个统称 ...

  10. Py层次递进与文件修改大程序,模块,name与file

    层次的递进与返回 #输入quit的时候返回上一阶层,输入exit退出所有的循环 tag=True while tag==True: level1=input('level1:') if level1= ...