悬线法(知识点总结)

《深入浅出进阶篇》洛谷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 大,这样我们显然可以得到一个更大的解... 阅读详情

相关推荐

京东云鼎环境配置与API安全接入实战:ISV服务商如何搞定数据加密与商家授权

本文详细介绍了京东云鼎环境配置与API安全接入的实战指南,帮助ISV服务商解决数据加密与商家授权等核心问题。通过京东开放平台的应用申请流程,结合多租户数据隔离策略和自动化授权实现,确保电商生态中的安全高效运营。文章还提供了避坑指南,助力开发者规避常见配置错误。

weixin_28705087的博客 353

悬线法

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

BoCong-Deng的博客 1万+

英飞凌TC3xx实战:PWM中点触发ADC采集+DMA自动搬运完整配置流程(基于ILLD库)

本文详细介绍了在英飞凌TC3xx系列微控制器上使用ILLD库实现PWM中点触发ADC采集并通过DMA自动搬运数据的完整配置流程。该方案适用于电机控制、电源管理等需要高精度定时采集的场景,通过GTM生成PWM信号、ADC采集和DMA传输实现全硬件自动化流程,显著提升系统效率。

weixin_42536058的博客 535

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

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

CtrlFU 1万+

Unity Sprite Editor切片功能详解:如何快速将一张大图拆分成多个小图(附常见问题解决)

本文详细解析了Unity Sprite Editor的切片功能,指导开发者如何高效地将一张大图拆分为多个独立小图。文章涵盖了自动与手动切片操作步骤、轴心点设置、子精灵命名管理等核心技巧,并针对切片错位、性能优化等常见问题提供了实用解决方案,帮助提升2D游戏资源处理效率。

i0j1k2l3m的博客 648

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 345

动态规划之悬线法

前言 悬线法是一种很好的,可以解决下面这类题型 从矩阵中找到一个满足某条件的最大矩阵 算法思路 悬线如下: 状态表示: 定义 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

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

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

悬线法思路:悬线的定义,就是一条竖线,这条竖线要满足上端点在整个矩形上边界或者是一个障碍点。然后以这条悬线进行左右移动,直到移至障碍点或者是矩阵边界,进而确定这条悬线所在的极大矩阵。我们定义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

[最新]MapReduce综合应用案例 — 气象数据清洗

【代码】[最新]MapReduce综合应用案例 — 气象数据清洗。

M_inherit的博客 1018

如何设置Xilinx以太网IP核的Pause帧处理

这里要注意,为什么是或,第一个条件是该功能使能取反,也就是说,如果你设置使能不打开的话,这个条件是直接满足的;先来看图中第二句,判断该以太网数据包为Global Pause帧(gpp),首先要满足Step1,然后是由上图中第二句代码(assign global_pause_packet)后面的所有项“与”(&&)起来的,就是说要满足后面所有的项,分别是DA符合,SA符合,Etype符合,Opcode符合,并且使能了该功能(即设置ctl_rx_enable_gpp=1)。如果没通过,则进入Step3。

qq_43416206的博客 618

动态规划——悬线法

动态规划——悬线法 悬线法用来求解最大子矩形问题。 极大悬线:以某个点为悬线的下端点,一直往上延伸的最大可行宽度为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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

memcpy0的博客 1598

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

悬线法zsbd

悬线法

qq_45809243的博客 1073

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【详解】悬线法(DP)

DP 悬线法

2403_87021226的博客 1313

【杂项】悬线法

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、付费专栏及课程。

余额充值