最大子矩形问题:在一个给定的矩形中有一些障碍点,要找出内部不包含任何障碍点的,轮廓与整个矩形平行或重合的最大子矩形。
定义有效子矩形为内部不包含任何障碍点的,边界与坐标轴平行的子矩形。
有效子矩形

非有效子矩形

定义极大子矩形为每条边都不能向外扩展的有效子矩形。
定义最大子矩形为所有有效子矩形中最大的一个(或多个)。
【极大化思想】
在一个有障碍点的矩形中的最大子矩形一定是一个极大子矩形。
设计算法的思路:通过枚举所有的极大子矩形,找出最大子矩形。
【两个算法】
[针对问题的性质,可以设计出两个不同的算法。他们分别适用于不同的情况。]
[约定:为了叙述方便,设整个矩形的大小为N×M,其中障碍点个数为S。]
[算法一](时间复杂度:O(S2) 空间复杂度:O(S))
极大子矩形的性质: 一个极大子矩形的每条边一定都不能向外扩展。更进一步地说,一个有效子矩形是极大子矩形的条件是这个子矩形的每条边要么覆盖了障碍点,要么与整个矩形的边界重合。

1)基本算法:枚举上下左右四个边界,然后判断组成的矩形是否是有效子矩形。 (复杂度:O(S5))[可以改进的地方: 产生了大量的无效子矩形]
2)初步改进算法: 枚举左右边界,然后对处在边界内的点排序。每两个相邻的点和左右边界一起组成一个矩形。
(复杂度:O(S3)) [可以改进的地方: 枚举了部分不是极大子矩形的情况]
设计算法的方向: 1、保证每一个枚举的子矩形都是有效的 ; 2、保证每一个枚举的子矩形都是极大的
算法的过程:枚举极大子矩形的左边界→ 根据确定的左边界,找出相关的极大子矩形→ 检查和处理遗漏的情况
(1)首先,将所有障碍点按横坐标从小到大的顺序将点标为1号点,2号点……

(2) 为了处理方便,在矩形的四个顶点上各增加1个障碍点。

(3) 因为左边界覆盖1号点且右边界在2号点右边的有效子矩形都不能包含2号点,所以需要修改上下边界,2号点在1号点上方,因此要修改上边界
前面的做法可以找出所有左边界覆盖了一个障碍点的极大子矩形,此外,还有两类遗漏的情况。
<1> 左边界与整个矩形的左边界重合,右边界覆盖一个障碍点的情况。 ( 解决方法:用类似的方法从右向左扫描一次。)
<2> 左边界与整个矩形的左边界重合,且右边界也与整个矩形的右边界重合的情况。( 解决方法:预处理时增加特殊判断。)
[优点:利用了极大化思想,复杂度可以接受,编程实现简单。]
[缺点:使用有一定的局限性,不适合障碍点较密集的情况。]

[算法二] (悬线法)(时间复杂度:O(NM) 空间复杂度:O(S))
( 因为算法1有使用的局限性,所以我们需要一种在障碍点很密集的时候仍能奏效的算法。设计一种复杂度依赖于整个矩形面积的算法 说明:如果整个矩形面积很大,可以通过离散化处理来优化。)
[悬线] 有效竖线:除了两个端点外,不覆盖任何障碍点的竖直线段。
悬线:上端点覆盖了一个障碍点或达到整个矩形上端的有效竖线。
如图: 都是合法悬线
每个悬线都与它底部的点一一对应。 矩形中的每一个点(矩形顶部的点除外)都对应了一个悬线。[悬线的个数=(N-1)×M]

如果把一个极大子矩形按x坐标不同切割成多个与y轴平行的线段,则其中至少存在一个悬线。

如果把一个悬线向左右两个方向尽可能移动,就能得到一个矩形,不妨称为这个悬线对应的矩形。
悬线对应的矩形不一定是极大子矩形,因为下边界可能还可以向下扩展。

原理:所有悬线对应矩形的集合一定包含了极大子矩形的集合。
通过枚举所有的悬线,找出所有的极大子矩形。
算法规模: 悬线个数=(N-1)×M 极大子矩形个数≤悬线个数
解决问题的关键: 对每个悬线的处理时间。
解决方法: 充分利用前面得到的信息。
[具体方法]
设 H[i,j]为点(i,j)对应的悬线的长度。
L[i,j]为点(i,j)对应的悬线向左最多能够移动到的位置。
R[i,j]为点(i,j)对应的悬线向右最多能够移动到的位置。

考虑点(i,j)对应的悬线与点(i-1,j)对应的悬线的关系。
如果(i-1,j)为障碍点,那么,(i,j)对应的悬线长度1,左右能移动到的位置是整个矩形的左右边界。即 H[i,j]=1, L[i,j]=0 , R[i,j]=m
如果(i-1,j)不是障碍点,那么,如图所示,(i,j)对应的悬线长度为(i-1,j)对应的悬线长度+1。即 H[i,j]=H[i-1,j]+1
如果(i-1,j)不是障碍点,那么,(i,j)对应的悬线左右能移动的位置要在(i-1,j)的基础上变化。 L[i,j]=max(L[i-1,j],(i-1,j) [左边第一个障碍点的位置])
同理,也可以得到R[i,j]的递推式 R[i,j]=min( R[i-1,j] ,(i-1,j)[右边第一个障碍点的位置])
[优点: 复杂度与障碍点个数没有直接关系。]
[缺点:障碍点少时处理较复杂,不如算法1]

[转载自:王知昆 《最大子矩形》]

转载于:https://www.cnblogs.com/lris-searching/p/9403184.html

用极大化思想解决最大子矩形问题相关推荐

  1. 最大子矩形问题的解决方法:悬线法

    给出一道板子题 洛谷4147 玉蟾宫 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  2. 极大化思想/悬线法题集

    用于解决最大子矩阵问题 P1387 最大正方形 题意: 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 数据范围:n,m<=100 解法: 悬线法计算出每个点左右上三 ...

  3. 分治法解决最大子数组问题

    分治法解决最大子数组问题 参考文章: (1)分治法解决最大子数组问题 (2)https://www.cnblogs.com/Christal-R/p/Christal_R.html (3)https: ...

  4. 运用贪心思想解决跳跃游戏

    运用贪心思想解决跳跃游戏 文章目录 运用贪心思想解决跳跃游戏 Jump Game I 1.题目描述 2.分析 3.代码 Jump Game II 1.问题描述 2.分析 3.动规代码[超时] 4.贪心 ...

  5. 二维数组求最小值_05-最大子矩形-最大值减去最小值小于或等于num的子数组数量...

    年轻即出发... 简书:https://www.jianshu.com/u/7110a2ba6f9e 知乎:https://www.zhihu.com/people/zqtao23/posts Git ...

  6. [OIBH] 糖果盒(Candy Box)——又一个最大子矩形

    http://codewaysky.sinaapp.com/problem.php?id=1056 这题和奶牛浴场略有区别,奶牛浴场只需要求出最大子矩形,而这题要求的是最大权重子矩形,不一定要最大的面 ...

  7. Python机器学习:SVM008SVM思想解决回归问题

    怎么定义拟合 比如线性,MSE值最小 SVM margin包含样本数量越多越好~ 取中间的直线为结果 引入超参数ε #SVM思想解决回归问题 import numpy as np import mat ...

  8. 利用计算机解决鸡兔同笼问题,利用极限思想解决复杂鸡兔同笼问题

    [导读] 中公事业单位为帮助各位考生顺利通过事业单位招聘考试!今天为大家带来数量关系:利用极限思想解决复杂鸡兔同笼问题. 在近些年的公考中,数量关系题目考察在越来越灵活的基础上出现了传统题型的回归,比 ...

  9. 动态规划算法思想解决找零钱问题

    前言 关于找零钱问题,网上已经有很多相关的资料以及优秀的文章博客等.这里写这篇博客的初衷很简单,就是为了方便自己,回过头来捡起这个知识能快一点,接受起来更易理解点:他人的文章写的再好,毕竟是别人的,学 ...

最新文章

  1. Scrapy框架的学习(9.Scrapy中的CrawlSpider类的作用以及使用,实现优化的翻页爬虫)
  2. VTK:BackgroundImage背景图用法实战
  3. ASP.Net缓存 1
  4. flask和ajax通信详细步骤与完整代码
  5. SAP 电商云 Spartacus UI 出现 breaking change 时,如何用文字来描述
  6. 哈夫曼树(Huffman Tree)的介绍、画法、哈夫曼树的可视化显示(Python代码实现)
  7. pyqt5 qscrollarea到达_pyqt5 QScrollArea设置在自定义侧(任何位置)
  8. Python使用模块中对象的几种方法
  9. ssis 导入excel_使用SSIS包将MS Excel数据导入数据库
  10. NET中所有的功能快捷键
  11. 在ASP.NET的服务器端使用message box(Message box Server side in ASP.Net)
  12. 用友NC的一些漏洞复现
  13. AD快捷键备份20210202
  14. 蚂蜂窝VS穷游最世界-自由行类App分析
  15. 计算机图形学在游戏设计中的应用
  16. oracle 中符号%3e,Oracle 数据类型
  17. 动态菜单,根据登录用户权限返回不同菜单,登录完成跳转到不同的首页
  18. 如何定制App Store榜单优化策略?
  19. Sequential Recommender Systems: Challenges, Progress and Prospects翻译和笔记
  20. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

热门文章

  1. sort()函数与升序、降序
  2. MySQL创建价格_mysql 建表时的价格用什么类型定义?
  3. c语言n个测试用例0为结束,编写测试用例 - osc_4l0h8in9的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 键盘向上箭头代码中怎么表示_Altium Designer中的快捷键汇总(收藏必备)
  5. sqlserver 参数化查询 允许为null_关于SQL Server的insert执行的秘密(上)一个最简单的insert分析...
  6. 清空div中的内容而不刷新整个页面_Vue中的$nextTick机制
  7. Linux中创建新用户并赋予指定目录的相关权限
  8. 依赖注入例子php,依赖注入小例子
  9. python导入上级目录下文件_python import 上级目录的导入
  10. 用vscode创建一个c项目_Visual Studio Code创建C#项目