悬线法(知识点总结)

《深入浅出进阶篇》洛谷P4147 玉蟾宫——悬线法dp 循环每一列,从任意一遍开始都行,我们以从左边开始为例子,当a[i][j]为空地,并且a[i-1][j]为空地的时候,该格子的上悬线能延伸到的位置就是上边一格能延伸到的位置。然后循环每一列,从最左边开始,当a[i][j]为空地,并且a[i][j-1]为空地的时候,该格子的左悬线能延伸到的位置就是左边一格能延伸到的位置。循环每一列,从最右边开始,当a[i][j]为空地,并且a[i][j+1]为空地的时候,该格子的右悬线能延伸到的位置就是右边一格能延伸到的位置。同理,我们要让r[i][j]尽可能的小。 阅读详情

暑假学的,当时也没总结,今天又看到,怕再忘了吧……

其实就还是dp的思想,搞来搞去这个样子……

思路来源

https://blog.youkuaiyun.com/qq_30358129/article/details/88044727

最大01子矩阵

题目可以用来交poj3494

h[i][j]表示以(i,j)为最下位置的悬线的高度,

l[i][j]表示(i,j)能拓到的最左位置,r[i][j]代表(i,j)能拓到的最右位置

枚举每一行,然后如果上一行有值的话就将同行子矩形变窄,否则不变

以上思想即可解决最大01子矩阵问题,然后单调栈也可以解决

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e3+10;
int m,n,a[N][N],l[N][N],r[N][N],h[N][N];
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j)
			{
				scanf("%d",&a[i][j]);
			}
		}
		int L=1e9,R=0,ans=0;
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j)
			{
				if(a[i][j]==1)L=min(L,j);//尺取连续段最左1的位置 
				else L=1e9;
				l[i][j]=L;
			}
			for(int j=m;j>=1;--j)
			{
				if(a[i][j]==1)R=max(R,j);//尺取连续段最右1的位置 
				else R=0;
				r[i][j]=R; 
			}
			for(int j=1;j<=m;++j)
			{
				if(a[i-1][j])
				{
					h[i][j]=h[i-1][j]+1;
					l[i][j]=max(l[i-1][j],l[i][j]);//收左线
					r[i][j]=min(r[i-1][j],r[i][j]);//收右线 
				}
				else h[i][j]=1;
				if(a[i][j])ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]);
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

最大同色子矩阵

魔改一下悬线法,把相同颜色的抠出来,考虑什么时候修改l[]和r[]的值

代码将h[j]不更新时初始化为极小/极大,从而将取max和取min对l[]和r[]的修改统一

相同的思想在于,如果上面可以继承,就一定会缩左界和右界,代表悬线必取的左右界

如果仍用单调栈的话,需要套一个尺取

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e3+10;
typedef long long ll;
int m,n,a[N][N];
int l[N],r[N],h[N];
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j)
			{
				scanf("%d",&a[i][j]);
			}
		}
		for(int j=1;j<=m;j++)
			l[j]=0,r[j]=m+1,h[j]=0;
		ll ans=0;
		int la,ra;
		for(int i=1;i<=n;++i)
		{
			la=0;ra=m+1;
			for(int j=1;j<=m;++j)
			{
				if(a[i][j]==a[i-1][j])
					h[j]++;
				else 
					h[j]=1,l[j]=0,r[j]=m+1;
				if(a[i][j]==a[i][j-1])
					l[j]=max(l[j],la+1);
				else 
					l[j]=j,la=j-1;//考虑到l[j]<=j而此处l[j]只能等于j
			}
			for(int j=m;j>=1;--j)
			{
				if(a[i][j]==a[i][j+1])
					r[j]=min(r[j],ra-1);
				else 
					r[j]=j,ra=j+1;//同理
				ans=max(ans,1ll*h[j]*(r[j]-l[j]+1)*a[i][j]);
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

 

悬线法dp总结 简介 所谓悬线,就是用一条线尽可能向两边拓展形成一个矩形,这样一条线就会构成矩形的宽。(原谅我也很难说明白悬线的具体定义) 用途 解决给定矩阵中满足条件的最大子矩阵 正确性 悬线法的正确性怎么证明?我们考虑最优解所代表的矩形(即满足条件的最大矩形),它的宽 hhh 一定来自于某一条悬线。可以用反证法,假设它的宽不来自于任意一条悬线,即每条悬线都比宽 hhh 大,这样我们显然可以得到一个更大的解... 阅读详情

相关推荐

论文学习:Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline

title: “Towards Automated Infographic Design:Deep Learning-based Auto-generation of Extensible Timeline” tags: [“论文评述”, “报告”] date: 2019-08-22 author: 叶慧 mathjax: true 论文:Towards Automated Infograph...

xiaoyehahaha的博客 731

悬线法

悬线法思路:悬线法,悬线的定义,就是一条竖线,这条竖线要满足上端点在整个矩形上边界或者是一个障碍点。然后以这条悬线 进行左右移动,直到移至障碍点或者是矩阵边界,进而确定这条悬线所在的极大矩阵。也就是说,我们要针对矩阵中每个点进行求极 大矩阵的操作,所以我们需要Left[]数组存每个点能到达的最右位置,Right[]数组存放每个点能到达的......

BoCong-Deng的博客 1万+

AMD MI50 Linux ROCm 6.4 手动编译与大模型推理实战

GPU加速计算是现代AI推理的核心基础,其性能依赖于硬件架构、驱动栈与运行时环境的深度协同。ROCm作为AMD开源GPU计算平台,采用‘自下而上’的Linux生态集成路径,强调对上游内核、编译器与固件的强耦合。MI50基于Vega 20(gfx900)架构,虽具备32GB HBM2高带宽显存与14.7 TFLOPS FP16算力,但因ROCm官方支持策略转向CDNA架构,自6.5版本起被移出支持列表,仅ROCm 6.4仍提供实验性兼容——这使其成为Linux下部署私有大模型的关键‘最后一班船’。本文围绕MI

weixin_32770423的博客 370

浅谈用极大化思想解决最大子矩形问题

【摘要】     本文针对一类近期经常出现的有关最大(或最优)子矩形及相关变形问题,介绍了极大化思想在这类问题中的应用。分析了两个具有一定通用性的算法。并通过一些例题讲述了这些算法选择和使用时的一些技巧。   【关键字】 矩形,障碍点,极大子矩形   【正文】 一、   问题 最大子矩形问题:在一个给定的矩形网格中有一些障碍点,要找出网格内部不包含任何障碍点,且边界与坐标轴平行的最大

CtrlFU 1万+

避坑指南:C#调用CodeSoft打印标签时常见的5个错误及解决方法

本文总结了C#调用CodeSoft打印标签时常见的5个核心错误及解决方案,涵盖环境配置、模板加载、变量赋值、打印机切换和资源管理。重点解析了如何避免COM对象创建失败、模板路径错误、变量名不匹配、打印机切换异常及内存泄漏等问题,帮助开发者实现稳定高效的标签打印集成。

weixin_29215815的博客 229

从零到一:Gromacs伞形采样的实战避坑指南

本文详细介绍了Gromacs伞形采样技术的实战应用与避坑指南,涵盖核心原理、环境准备、参数设置、数据分析及性能优化等关键环节。特别针对蛋白质-配体结合自由能计算等典型应用场景,提供了弹簧常数设置、采样窗口间距等实用参数建议,帮助研究人员高效完成分子动力学模拟。

weixin_29243279的博客 516

动态规划之悬线法

前言 悬线法是一种很好的,可以解决下面这类题型 从矩阵中找到一个满足某条件的最大矩阵 算法思路 悬线如下: 状态表示: 定义 h[i][j]h[i][j]h[i][j] 为从 (i,j)(i,j)(i,j) 往下的一条悬线最长长度,定义 l[i][j],r[i][j]l[i][j],r[i][j]l[i][j],r[i][j] 为从 (i,j)(i,j)(i,j) 往下的一条悬线能往左/右延申到的左右边界。 状态转移: 不同的题有不同的转移方式。 例题1:最大只包含1的矩形 例题链接 题目描述: 一个

weixin_43602607的博客 285

Frida实战:如何用adb快速连接网易mumu模拟器进行参数Hook(附常见CPU架构问题排查)

本文详细介绍了如何使用Frida和adb快速连接网易MuMu模拟器进行参数Hook,包括环境配置、架构适配、Frida-server部署及常见问题排查。特别针对CPU架构兼容性问题提供了实用解决方案,帮助开发者高效完成逆向调试任务。

weixin_29274969的博客 290

【算法】最大子矩阵——悬线法

悬线法思路:悬线的定义,就是一条竖线,这条竖线要满足上端点在整个矩形上边界或者是一个障碍点。然后以这条悬线进行左右移动,直到移至障碍点或者是矩阵边界,进而确定这条悬线所在的极大矩阵。我们定义hijh[i][j]hij表示点ij(i,j)ij的悬线的长度。(及以点ij(i,j)ij,为边界的最大子矩阵的宽)lijl[i][j]lij表示点ij(i,j)ij的悬线往左最长能延伸到哪。rijr[i][j]rij表示点ij(i,j)ij。

conti123的博客 869

Latex参考文献中大写字母编译后自动变成了小写,如何保持原字母大写形式

bib文件参考文献中大写自动变为小写,如何保持原大写问题。Latex: 保持参考文献大小写,overleaf文献编译后,原大写字母自动变成了小写字母,如何保持原字母大写

我的个人博客 5806

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 278

动态规划——悬线法

动态规划——悬线法 悬线法用来求解最大子矩形问题。 极大悬线:以某个点为悬线的下端点,一直往上延伸的最大可行宽度为111的线段。 左右扩展:将极大悬线向左向右进行最大化扩展。 因此定义变量h[x]h[x]h[x],l[x]l[x]l[x]和r[x]r[x]r[x],分别表示极大悬线的高度,左扩展的边界,右扩展的边界。 例题 P1169 棋盘制作 #include <bits/stdc++.h> #define FR freopen("in.txt", "r", stdin) using

jiahonghao2002的博客 401

如何用python自己复现worldquant brain中的回测结果

本文介绍了在Python中复现WorldQuant Brain平台上alpha 101因子1和4的回测框架构建要点。重点分析了Brain平台的策略设置:使用TOP 3000高流动性股票(可用中证1000/2000替代);delay=1表示t日信号在t+1日开盘调仓;详细解释了market/sector/industry/subindustry四级中性化方法;说明了decay参数控制持仓权重线性衰减;以及TRUNCATION参数限制单股仓位风险。文章还探讨了不同调仓时点的实现差异,为自主构建量化回测系统提供了

夏之微风的博客 740

算法学习笔记(2) 悬线法

文章目录1. 悬线法思路介绍2. 悬线法求最大矩形代码实现3. 各OJ题目 1. 悬线法思路介绍 以前碰到过最大矩形/最大正方形之类的问题,如LeetCode上的85. 最大矩形和近似题目84. 柱状图中最大的矩形,以及84题的变形题目42. 接雨水、面试题 17.21. 直方图的水量和进阶407. 接雨水 II,这些题目和更多题目都可以用单调栈来解决。 不过在这里,我们更关注最大矩形/正方形的另一种解法——悬线法,这是一种比较容易的DP技巧,也能在 O(nm)O(nm)O(nm) 时间内解决最大矩形/正方

memcpy0的博客 1598

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

悬线法zsbd

悬线法

qq_45809243的博客 1073

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【详解】悬线法(DP)

DP 悬线法

2403_87021226的博客 1311

【杂项】悬线法

1.悬线法的用途 针对求给定矩阵中满足某条件的极大矩阵,比如“面积最大的长方形、正方形”“周长最长的矩形等等”。可以满足在时间复杂度为O(M*N)的要求,比一般的枚举高效的多,也易于理解。 2.悬线法思路 悬线法,悬线的定义,就是一条竖线,这条竖线要满足上端点在整个矩形上边界或者是一个障碍点。然后以这条悬线进行左右移动,直到移至障碍点或者是矩阵边界,进而确定这条悬线所在的极大矩阵。也就是说,我们要针对矩阵中每个点进行求极大矩阵的操作,所以我们需要Left[]数组存每个点能到达的最右位置,Right[]

zsjzliziyang的博客 885

悬链线

悬链线 (Catenary)指的是一种曲线,指两端固定的一条(粗细与质量分布)均匀、柔软(不能伸长)的链条,在重力的作用下所具有的曲线形状,例如悬索桥等,因其与两端固定的绳子在均匀引力作用下下垂相似而得名。适当选择坐标系后,悬链线的方程是一个双曲余弦函数,其标准方程为:y=a cosh(x/a),其中,a为曲线顶点到横坐标轴的距离。 等高悬链线 标准方程 其中,a为常数,是曲...

moonlightpeng的博客 1万+

悬线法(二维贡献法)——玉蟾宫

题目来源:https://www.luogu.com.cn/problem/P4147。

m0_60738889的博客 972

【悬线法】学习总结

【悬线法】学习总结

qq_35975367的博客 606

动态规划(DP)方法:悬线法

在动态规划问题中,有一类问题要求大矩阵的最大或最小子矩阵,这类问题往往可以采用悬线法,下面由一道例题来引入此法。 洛谷P1169[ZJOI2007]棋盘制作如果直接暴力枚举此题,时间复杂度会较大,一般情况下都会想到利用DP解题,但难以入手,我们不妨分析下面一个样例。 00110010011111101100 \begin{matrix} 0&0&1&1&0& \\0&1&0&0&1\\1&1&1&1&1\\0&1&1&0&0 \end{matrix} 0010​0111​1011​1010​0110​ 在初

mlh12356的博客 532

动态规划悬线法

#include<bits/stdc++.h> using namespace std; const int N=2010; typedef long long ll; int ma[N][N],l[N][N],r[N][N],up[N][N]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++)

zhangjie132761的博客 906
上一篇: 湖南省第十四届程序设计大赛 H.千万别用树套树(思维题+容斥)
下一篇: Codeforces Round #605 (Div. 3) 补题(E最短路/多源bfs、Fdp+输出路径)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值