最大子矩阵问题悬线法 学习笔记
学习材料:王知昆《浅谈用极大化思想解决最大子矩阵问题》
【最大子矩阵问题】
在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的、轮廓与整个矩形平行或重合的最大子矩形。
【定义子矩形】
有效子矩形:内部不包含障碍点的、轮廓与整个矩形平行或重合的子矩形。
极大子矩形:每条边都不能向外扩展的有效子矩形。
最大子矩形:所有有效子矩形中最大的一个(或多个)。
【极大化思想】
在一个有障碍点的矩形中最大子矩形一定是极大子矩形。
设计算法的思路:枚举所有的极大子矩形,找到最大子矩形。
设NM分别为整个矩形的长和宽,S为内部的障碍点数。
【算法1】
时间复杂度:O(S^2) 空间复杂度:O(S)
由于极大子矩形的每一条边都不能向外扩展,那么极大子矩阵的每条边要么覆盖了障碍点,要么与整个矩形的边界重合
基本算法:枚举上下左右四个边界,然后判断组成的矩形是否是有效子矩形。
复杂度:O(S^5) 可以改进的地方:产生了大量的无效子矩形。
初步改进的算法:枚举左右边界,然后对处在边界内的点排序,每两个相邻的点和左右边界组成一个矩形。
复杂度:O(S^3) 可以改进的地方:枚举了部分不是极大子矩形的情况。
综上,设计算法的方向:
1、保证每一个枚举的矩形都是有效的。
2、保证每一个枚举的矩形都是极大的。
算法的过程:
枚举极大子矩形的左边界——>根据确定的左边界,找出相关的极大子矩形——>检查和处理遗漏的情况
(1)按照横坐标从小到大的顺序将所有的点编号为1,2,3...
(2)首先选取1号点作为要枚举的极大子矩形的左边界,设定上下边界为矩形的上下边界
(3)从左到右扫描,第一次到2号点,确定一个极大子矩形,修改上下边界;第二次找到3号点,以此类推。
(4)将左边界移动到2号点,3号点,,,以同样的方法枚举
遗漏的情况:
1、矩形的左边界与整个矩形的左边界重合。解决方法:用类似的方法从左到右扫一遍
2、矩形的左边界与整个矩形的左边界重合,且矩形的右边界与整个矩形的右边界重合。解决方法:预处理时增加特殊判断。
优点:利用的极大化思想,复杂度可以接受,编程实现简单。
缺点:使用有一定的局限性,不适合障碍点较密集的情况。
【算法2】
时间复杂度O(NM) 空间复杂度O(NM)
定义
有效竖线:除了两个端点外,不覆盖任何一个障碍点的竖直线段。
悬线:上端覆盖了一个障碍点或者到达整个矩形上边界的有效线段。
每个悬线都与它底部的点一一对应,矩形中的每一个点(矩形顶部的点除外)都对应了一个悬线。
悬线的个数=(N-1)*M;
如果把一个极大子矩形按照横坐标的不同切割成多个与y轴平行的线段,那么其中至少有一个悬线。
如果把一个悬线向左右两个方向尽可能的移动,那么就得到了一个矩形,我们称它为悬线对应的矩形。
悬线对应的矩形不一定是极大子矩形,因为下边界可能还可以向下扩展。
设计算法:
具体方法:
代码实现具体见WC2002 奶牛浴场(算法1)
codevs1159最大全0子矩阵(算法2)
最大子矩阵问题悬线法 学习笔记相关推荐
- 最大子矩阵问题悬线法 学习小结
最近在写dp的题目 但是我这个同学又又又又生病了 学习了一下多叉树的背包问题和最大子矩阵的问题,还有攒了几道期望,先总结一下矩阵问题: 问题模型: 在一个给定的矩形中有一些障碍点,找出内部不包含障碍点 ...
- 算法学习笔记(2) 悬线法
本文属于「算法学习」系列文章之一.之前的[数据结构和算法设计]系列着重于基础的数据结构和算法设计课程的学习,与之不同的是,这一系列主要用来记录对大学课程范围之外的高级算法学习.优化与使用的过程,同时也 ...
- [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵
https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...
- 【BZOJ-30391057】玉蟾宫棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 753 Solved: 444 [Submit][Status][Discuss] ...
- 【BZOJ-1127】KUP 悬线法 + 贪心
1127: [POI2008]KUP Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 317 Solved: 1 ...
- BZOJ 3039: 玉蟾宫( 悬线法 )
最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...
- [ZJOI2007] 棋盘制作(单调栈 / DP悬线法)
problem 洛谷链接 solution1-单调栈 很容易想到,预处理出每个点向上最大能延伸的长度,然后对每个点求一个矩阵面积. 然后思考优化,不难想到每次对一行进行求解. 每一行的所有列一起构成了 ...
- 2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)
传送门 对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案. 代码: #include<bits/stdc++. ...
- BZOJ1127 POI2008KUP(悬线法)
首先显然地,如果某个格子的权值超过2k,其一定不在答案之中:如果在[k,2k]中,其自身就可以作为答案.那么现在我们只需要考虑所选权值都小于k的情况. 可以发现一个结论:若存在一个权值都小于k的矩阵其 ...
最新文章
- SpringMVC一些功能
- java主线程捕获子线程中的异常
- tableau可视化数据分析60讲(十五)-tableau常用可视化视图(散点图气泡图)
- 2002: [Hnoi2010]Bounce 弹飞绵羊
- git push被拒绝_规范git项目提交并自动生成项目commit log
- iphone黑屏转圈_iphone XR被曝新BUG,众多用户中招,无规律黑屏假死
- qt设置路径为应用程序启动路径
- 帧中继更具体配置信息
- ART、JIT、AOT、Dalvik之间有什么关系?
- html5 数据懒加载图片,Jsoup+HtmlUnit获取懒加载数据
- 15个最好的Bootstrap设计工具推荐
- 如何处理春节效应——若干券商研究团队的经验
- chrome是什么?
- 32位MIPS流水线CPU设计
- 常见的网络安全风险有哪些?
- 完美洗牌算法简析与代码实现
- 数据结构01秦九算法
- Windows的故障恢复控制台应用实例详解
- PC817TL431的配合电路问题
- 易升更新win10 1903错误:此电脑无法升级到windows 10