算法学习 单调栈 最大子矩阵问题

单调栈应用(poj2559最大矩形、最大01子矩阵) 首先介绍一下单调栈(或单调数组)。 单调栈是一个这样的数据结构: 1. 这个数组一定是单调递增(或单调递减)的数组; 2. 可以在末尾添加元素; 3. 在添加元素的过程中,允许弹出尽可能少的元素是数组依旧保持单调性; 例如:原来的单调数组是(1,3,5,7,9),现在希望添加一个元素6。此时我们把末尾的9,7两个元素均删除,插入6在末尾,新的单调数组变成(1,3,5,6)。 可以看出,当我们需要在这个数组末尾添加元素时,需要删除末尾所有大于新元素的元素,再进行添加。 用std::stack实现单调栈的过程 阅读详情

单调栈即栈的元素存储满足单调性。
单调性是基于从栈顶到栈底元素大小关系而言的,如:(代码中的大小关系可以自定义,如将<改为<=等)
单调递增栈:栈顶到栈底单调递增

	stack<int> stk;
	int tmp;
	...
	...
	while(!stk.empty()&& stk.top() < tmp) {
		stk.pop();
	}

单调递减栈:栈顶到栈底单调递减

    stack<int> stk;
	int tmp;
	...
	...
	while(!stk.empty()&& stk.top() > tmp) {
		stk.pop();
	}

单调栈特点:适用于子结构有局部单调性的数据结构,如8 9 2 1 4 5 2 3,其子结构8 9、2、1 4 5、2 3都具有局部单调递增性。

经典题目:最大子矩阵

牛客网:小A的柱状图

题目描述
柱状图是有一些宽度相等的矩形下端对齐以后横向排列的图形,但是小A的柱状图却不是一个规范的柱状图,它的每个矩形下端的宽度可以是不相同的一些整数,分别为a[i]a[i],每个矩形的高度是h[i]h[i],现在小A只想知道,在这个图形里面包含的最大矩形面积是多少。
在这里插入图片描述
输入描述:

一行一个整数N,表示长方形的个数
接下来一行N个整数表示每个长方形的宽度
接下来一行N个整数表示每个长方形的高度

输出描述:
一行一个整数,表示最大的矩形面积

说明
样例如图所示,包含的最大矩形面积是8

备注:
1≤n≤1e6,1≤a[i]≤100,1≤h[i]≤1e9

由于笔者时间有限,直接粘代码了,可以结合代码来思考
附代码:

#include <bits/stdc++.h>
#define MAXN 1000005
#define LL long long
using namespace std;

int n;
LL maxmum = -1;
LL a[MAXN], h[MAXN];
stack<int> stk;

int main() {
	scanf("%d",&n);
	for(int i = 1; i <= n; i++)
		scanf("%lld",a+i);
	for(int i = 1; i <= n; i++)
		scanf("%lld",h+i);
	stk.push(0);
	for(int i = 1; i <= n+1;i++){
		int j = stk.top();
		if(h[i] > h[j])//如果比栈顶元素的h大,入栈
			stk.push(i); 
		else {//否则,在出栈的同时维护最大值(通过枚举栈顶元素的h所对应的最大宽度),在最后才能入栈,此时入栈的元素的h更新为枚举出来的最大宽度 
			LL width = 0;
			while(!stk.empty()&& h[i] <= h[j]) {
				width += a[j];
				maxmum = max(maxmum,h[j] * width);
				stk.pop();
				j = stk.top();
			}
			stk.push(i);
			a[i] += width; 
		}
	}
	printf("%lld\n",maxmum);
	return 0;
}
[codevs1159]最大全零子矩阵 传送门←这里用二维单调栈 其实就是对每一行跑一遍单调栈……#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<stack> using namespace std; const int MAXN = 2000 + 50; int map[MAXN][MAXN],f[MAXN][MAXN 阅读详情

相关推荐

POJ 3494 Largest Submatrix of All 1's(最大全1子矩阵面积、单调栈)

题目链接: POJ 3494 Largest Submatrix of All 1’s 题意: 给出一个n∗mn*m的01矩阵,求出最大全1子矩阵面积。 数据范围:n,m≤2000n,m\leq 2000 分析: 我们把每一行单独处理,把从这行向上连续延伸全为1的最大长度看成是矩形的高,那么每行其实就是求个最大矩形面积。 height[i][j]:第i行第j列元素往上最长的连续1长度h

ramay7 1854

最大01子矩阵问题(单调栈优化)

题目描述: 顾名思义,给定n*m大小的01矩阵,要求找到1数量最多的全1子矩阵 问题降阶: 思考二维问题前,先将问题降阶,思考该问题在一维状况下的解决方式会是一个比较好的思路。 题目链接: 485.Max Consecutive Ones 题意: 在01数组中寻找最长连续1的长度 思路: 简单的dp,维护数组中每个位置作为结尾的最长连续1长度。 代码: /* Author Owen_Q */ class Solution { public: int findMaxCons.

Owen_Q的博客 1565

单调栈——(直方图内最大矩形 || 最大全1子矩阵 )

单调栈,顾名思义就是说栈内的元素,按照某种方式排序下,必须是单调的。如果新入栈的元素破坏了单调性,就弹出栈内元素,直到满足单调性。 它可以很方便地求出某个数的左边或者右边第一个比它大或者小的元素,而且总时间复杂度O(N)。 直方图内最大矩阵 给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出在这个柱形图中的最大面积的长方形。例如:7

say_haha的博客 2410

最大子矩阵(dp)

输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。思路:参考最大和问题,做垂直的前缀和,对首尾行进行枚举,时间复杂度为o(n³)比如,如下4 * 4的矩阵。这个子矩阵的大小是15。输出最大子矩阵的大小。

xuxizhe0104的博客 309

最大01子矩阵相关

听太神的话,看了一下2003王知昆的论文,受益匪浅。 貌似这种矩形的题都会跟单调队列有关系,然而我又不是非常擅长单调队列和单调栈,所以过一阵子仔细学习一下。 太神在考场上出了一道比较不错的题目(虽然不是原创),表示自己在考场上YY的非常扯淡的算法,用了一些比较奇葩的东西,如果开了O2,应该就能A了。 先上例题吧。 bzoj3039 玉蟾宫 题意:求最大的全是0的矩阵。n 这种方

Oxer的专栏 1233

算法笔记——左神进阶(3)单调栈结构:数组的最大数、最大子矩阵、数组烽火传递

单调栈结构的使用场景 单调栈解决的问题是在一个数组中每一个数,要求左边离他近的比他大的和右边离他近的比他大的数 思考的问题:如果知道所有数上得到上述要求,同时复杂度满足O(N)。 暴力解的时间复杂度是O(N^2) 单调栈结构:单调栈内,从栈底到栈顶满足从大到小。 逐个入栈出栈: 复杂度为O(N) 大的放下面,如果遇到一个数比栈顶的数大,则栈顶的数出栈,此时他的右边最近比他大的数就是让他出栈的数,...

现实 理想青年的博客 605

【C++贪心 单调栈】1727. 重新排列后的最大子矩阵|1926

给你一个二进制矩阵 matrix ,它的大小为 m x n ,你可以将 matrix 中的 列 按任意顺序重新排列。 请你返回最优方案下将 matrix 重新排列后,全是 1 的子矩阵面积。

闻缺陷则喜何志丹 1274

动规 - 最大子矩阵问题

文章目录悬线法学习资料单调栈学习资料 悬线法 学习资料 题解 P1169 【[ZJOI2007]棋盘制作By 顾z 最大子矩阵问题&悬线法 学习笔记By Clove_unique [DP专题]悬线法 ByLevenKoko 浅谈用极大化思想解决最大子矩形问题By 王知昆 单调栈 学习资料 浅谈单调栈的实现方式和简单应用By COLIN·GAO ...

竹摇清影照幽窗 441

SAP Script表单开发中ABAP preform方法的实战应用与调试技巧

本文深入探讨了在SAP Script表单开发中调用ABAP程序(preform方法)的实战应用与调试技巧。通过一个获取供应商版本名称的实例,详细讲解了如何在SE71中嵌入PERFORM指令、编写ABAP子程序进行数据查询与处理,并重点介绍了使用SAP Script Debugger进行高效调试的方法,帮助开发者灵活扩展表单功能,实现复杂业务逻辑。

o0p1q2r3的博客 551

抖音直播间人气接口算法 抖音协议

抖音直播间人气接口算法 抖音协议 抖音算法

Q44804487的博客 1万+

最大子矩形POJ2559

最大子矩形POJ2559 思路 题干在这:POJ2559 简简单单的单调栈 ac代码 #include<cstdio> #include<vector> #include<algorithm> #define ll long long using namespace std; struct rectangle { ll height; ll length; ...

没有自旋的π介子 260

Palantir解密:“本体”的建模逻辑及其扩展方向

上一篇重点从对现实世界建模的角度探讨了“本体”在数字化架构中的核心意义。这里借Palantir的“本体”概念、解析Palantir只是起点,目标旨在以他山之石攻玉——探索数字世界的底层架构逻辑,最终为构建自主体系提供思考。Palantir以“本体论”为核心的建模方案是否代表终极答案,不宜过早下结论,但其思路值得深入剖析。

SZSDQJC的博客 2635

P4147 玉蟾宫

11分钟过了这个题,但是这是洛谷少有的把难度给低的题目,这题算是01矩阵求最大子矩阵的模板题,我们的思路就是输入的时候做一下预处理,或者说是组织一下状态?对每个元素,如果是1,那么累加上面的元素,如果是0,那么它的累加数组也是0,这样就变成了n行,n个一维的求最大子矩阵的问题,这个问题用单调栈昨天已经练习的很熟练了,主要是这个01矩阵求最大子矩阵(全1)的状态的组织方法要好好理解一下,

m0_73035684的博客 230

RK3288芯片MIPI-DSI显示疑难杂症大揭秘:从点不亮到花屏全攻克

本文针对RK3288芯片MIPI-DSI接口常见的显示异常问题进行系统性分析,提出了完整的排查解决方案。硬件方面,重点检查排线连接、电源供应和散热问题;软件方面,强调屏参配置、驱动版本及时序参数的精确调整。通过两个典型案例(点不亮与花屏)具体说明排查流程,并指出未来优化方向应包括提升芯片抗干扰能力、开发智能自适应驱动程序等。该手册为开发者提供了从基础原理到实际问题的全面指导,能有效缩短故障排查时间,确保显示系统稳定运行。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 661

基于matlab的LFM脉冲压缩仿真

传统雷达测距是通过发射点频脉冲串实现的,通过发射脉冲与回波的时延确定目标的距离。此类方法易于实现,对接收机的要求较低。一般要获取更好的距离分辨力,需要增加发射信号的带宽,对于点频脉冲信号即需要减小发射脉冲宽度;而为获取更大的探测距离,提升雷达威力,则需要发射更大占空比的脉冲串。由于点频信号的时宽带宽积约等于1,因此不能同时增加信号的时宽和带宽。若要保持距离分辨力,增大占空比就需要减少雷达的脉冲重复周期(PRT)。这样会减小雷达的无模糊探测距离,也会造成目标回波频繁被遮挡,损失雷达威力。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 1771

2024蓝桥杯每日一题(单调队列)

2024蓝桥杯每日一题(单调队列)

w2563216521的博客 1630

ETAS工具导入DBC生成Com协议栈

ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项不管是导入DBC还是arxml,本质上都是为了生成对应的com协议栈,目的是为了减少重复的工作量,所以,前期定义好收发的矩阵很重要,一般导入一次之后,后面就可以按变更点手动更改了。

赞的博客 1712

[POJ2559]Largest Rectangle in a Histogram (栈)

题意 如图所示,在一条水平线上有n个宽为1的矩形,求包含于这些矩形的最大子矩形面积(图中的阴影部分的面积即所求答案)。 思路 一个很老的,也是一个很好的题目。 维护一个单调栈即可。 不过在洛谷SP1805里是蓝题,还真是意外呢。 代码 #include <iostream> #include <cstdio> using namesp...

diejia6473的博客 159

【华为OD机试真题】3、 路灯照明问题 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >在一条笔直的公路上安装了N个路灯,从位置0开始安装,路灯之间间距固定为100米。 每个路灯都有自己的照明半径,请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。

KJ.JK 1万+

淘宝母婴用品数据挖掘及可视化分析研究

1. 背景介绍 在当今的电子商务时代,母婴用品市场已经成为了各大电商平台的一片蓝海。淘宝作为中国最大的电子商务平台,其上的母婴用品交易数据自然引人关注。理解这些数据,可以帮助商家更好地制定营销策略,也可以帮助消费者更好地选择产品。因此,本文将对淘宝母婴用品的数据进行深入的挖掘和分析。 1.1 电子商务的

AI天才研究院 1258

2021“MINIEYE杯”中国大学生算法设计超级联赛(1)

1006 Xor sum 前缀知识 可以将打印的注释和IOS去掉,观察变化 #include<bits/stdc++.h> #define rep(i,x,y) for(auto i=(x);i<=(y);++i) #define dep(i,x,y) for(auto i=(x);i>=(y);--i) #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) typedef long long ll; usin

xiaomingyihao的博客 370

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【搞定算法】单调栈问题:直方图中的最大矩形面积、求最大子矩阵的大小、可见山峰问题

目 录: 1、单调栈结构 1.1、单调栈结构的实现:无重复元素 1.2、单调栈结构的实现:有重复元素 2、单调栈结构的应用 2.1、直方图中的最大矩形面积 2.2、求最大子矩阵的大小 2.3、可见山峰问题 本文主要用于讲解一种在面试笔试中经常使用到的一种算法结构:单调栈结构。 1、单调栈结构 单调栈结构:给一个数组,求任何位置左边和右边离它最近的比它大/小的数。 要求:栈...

Java学习 3043

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

求最大子矩阵的大小(单调栈)

单调栈 1. 单调栈的结构 背景:给定一个数组,求数组中每一个元素的左边距离其最近的比它小的值,和右边距离其最近的比它小的值。 数组:arr:{3,5,4,2,6} arr[i] left right 3 null 2 5 3 4 4 3 2 2 null null 6 2 null 思路:设计一个栈,依次存入的元素大于等于栈顶元素,保持栈中元素从下往上逐渐...

GoSantiago的博客 877

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

左神算法:求最大子矩阵的大小(Java版)

本题来自左神《程序员面试代码指南》“求最大子矩阵的大小”题目。 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。   例如: 1 0 1 1 1 1 1 1 1 1 1 0   其中,最大的矩形区域有 6 个 1,所以返回 6。 题解 本题利用 单调栈 的思想。 关于单调栈,前面我们讲过。可以参考这篇博客 左神算法:单调栈结构(Java版) 过程草稿图: 代码 import java.util.Stack; public c.

寒泉 6万+

直方图中最大矩形面积(单调栈) + 最大的全1子矩阵(HDU1505) + 两个矩阵最大的相同子矩阵 + 最大子矩阵和

直方图中最大矩形面积 思想:主要是采用单调栈的思想,栈中按照每个矩形的高度递增存储下标,每次需要出栈时计算面积大小。 算法过程: 给定的n个值组成的序列,每个值代表矩形高度,宽度都相等。 1.初始栈空,第一个下标直接入栈; 2.遍历到 i 时,比较与栈顶元素对应的大小 若等于栈顶元素,则跳过; 若大于栈顶元素,则入栈; 若小于栈顶元素,则一直取出栈顶元素t,并计算面积( ( i - t ) *...

Dave_lzw的博客 467
上一篇: Java程序设计 重写equals方法遇到父类与子类的比较问题
下一篇: 算法学习 简单的动态规划题 乌龟棋
MikeSentence
博客等级 码龄8年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值