学习笔记 悬线法

  • 最大子矩阵问题:

在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的,边与整个矩形平行或重合的最大子矩形。

极大子矩型:无法再向外拓展的有效子矩形

最大子矩型:最大的一个有效子矩形

特别的,在一个有障碍点的矩形中,最大子矩形一定是极大子矩形

  • 悬线法

悬线:上端覆盖了一个障碍点或者到达整个矩形上边界的有效线段

每个悬线上的点的与底部的点一一对应,矩形中每一个点(矩形顶部点除外)都对应了一条悬线。

如果把一条悬线向左右两个方向尽可能的移动,那么就得到了一个矩形。

注意:悬线对应的矩型不一定是极大子矩阵,因为悬线定义中固定了悬线的下边界,故而,悬线左右移动所得到的矩形无法向下扩展。

  • 悬线法的实现

      三个重要的元素:

  1. heighti,j :表示以( i ,j )为底的悬线的高 (初始化为1)
  2. lefti,j        :表示向左最多能移动到的位置  (初始化为j)
  3. righti,j     : 表示向右最多能移动到的位置   (初始化为j)

其中的left,right要视题目要求进行进一步的初始化,如例题

转移:

如果点  不是障碍点,那么,以  为底的悬线就等于以  为底的悬线加点  到点       的线段。因此,  。

当然还要注意左右边界的问题

以上图片转自  https://zhuanlan.zhihu.com/p/46382722

画个图理解一下

那么计算面积就轻而易举

对于以点  为底的悬线对应的子矩形,其面积计算为

问题解:

时间复杂度:  ;空间复杂度: 

例题:luogu P1169 棋盘制作

直接上代码

 #include<cstdio>
#include<algorithm>
#include<iostream>
#define maxn 2010
#define re register
using namespace std;
int n,m,ans1,ans2;
int map[maxn][maxn],height[maxn][maxn];
int l[maxn][maxn],r[maxn][maxn];
int main()
{
scanf("%d%d",&n,&m);
for(re int i=;i<=n;++i)
for(re int j=;j<=m;++j)
{
scanf("%d",&map[i][j]);
height[i][j]=;
l[i][j]=r[i][j]=j;
}
for(re int i=;i<=n;++i)
for(re int j=;j<=m;++j)
{
if(map[i][j]!=map[i][j-])
l[i][j]=l[i][j-];
}
for(re int i=;i<=n;++i)
for(re int j=m-;j>=;j--)
{
if(map[i][j]!=map[i][j+])
r[i][j]=r[i][j+];
}
//以上为初始化
for(re int i=;i<=n;++i)
for(re int j=;j<=m;++j)
{
if(i>&&map[i][j]!=map[i-][j])
{
height[i][j]=height[i-][j]+;
l[i][j]=max(l[i][j],l[i-][j]);
r[i][j]=min(r[i][j],r[i-][j]);
}
int a=r[i][j]-l[i][j]+;
int b=min(height[i][j],a);
ans1=max(ans1,a*height[i][j]);//最大矩形
ans2=max(ans2,b*b);//最大正方形
}
printf("%d\n%d",ans2,ans1);
return ;
}

注:部分内容转载自  
Flavius Buffon:悬线法用来求解最大子矩形问题 同时也是参考文献

[P1169] 棋盘制作 &悬线法学习笔记的更多相关文章

  1. 洛谷P1169 棋盘制作(悬线法)

    题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...

  2. P1169 [ZJOI2007]棋盘制作 && 悬线法

    P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给 ...

  3. 洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划

    P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定 ...

  4. P1169 [ZJOI2007]棋盘制作[悬线法/二维dp]

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...

  5. P1169 [ZJOI2007]棋盘制作——悬线法

    ---恢复内容开始--- 给你一个矩阵,选出最大的棋盘,棋盘的要求是黑白相间(01不能相邻),求出最大的正方形和矩形棋盘的面积: 数据n,m<=2000; 这个一看就可能是n2DP,但是写不出. ...

  6. P1169 [ZJOI2007]棋盘制作 悬线法or单调栈

    思路:悬线法\(or\)单调栈 提交:2次 错因:正方形面积取错了\(QwQ\) 题解: 悬线法 讲解:王知昆\(dalao\)的\(PPT\) 详见代码: #include<cstdio> ...

  7. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  8. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...

  9. [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵

    https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...

随机推荐

  1. shell之最常用的服务脚本

    任务需求:以最简单的方式管理 /usr/local/php7/sbin/php-fpm -c /usr/local/php7/etc/php.ini 这条命令 包括启动停止重启 使用技术:shell脚 ...

  2. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(13)- 从Serial(1-bit SPI) EEPROM/NOR恢复启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial EEPROM/NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启 ...

  3. Python3+Selenium2完整的自动化测试实现之旅(七):完整的轻量级自动化框架实现

    一.前言 前面系列Python3+Selenium2自动化系列博文,陆陆续续总结了自动化环境最基础环境的搭建.IE和Chrome浏览器驱动配置.selenium下的webdriver模块提供的元素定位 ...

  4. 理解PHP的垃圾回收机制

    什么是垃圾回收机制 使用的是“引用计数”方式进行回收.简单地理解的话,就是每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存.当指向该片内存的指针数量为0,那么该片内存区域就可以被回收 ...

  5. Centos7.3安装和配置Mysql5.7

    主要转自这篇文章:https://www.cnblogs.com/wishwzp/p/7113403.html 这篇文章已经讲的很详细,亲测可用,对于基本不懂linux的小白应该也能看得懂.只是没有修 ...

  6. 【Dojo 1.x】笔记2 使用服务器环境及使用模块

    又开坑了.上次静态html页面完成本地module的引用,算是成功了,但是并不知道是怎么运作的,没关系慢慢来. 我用的环境是VSCode,这次因为官方说要在服务器环境下运行,所以就用上了VSCode的 ...

  7. Net中获取程序集路径

      从内存中加载的程序集,无路径   IIS中路径 protected void Page_Load(object sender, EventArgs e) { Response.Write(&quo ...

  8. IEC104协议规约解析

    一.四遥信息体基地址范围 104调度规约有1997年和2002年两个版本,在流程上没有什么变化,02版只是在97版上扩展了遥测.遥信等信息体基体址,区别如下: 类别 1997版基地址 2002版基地址 ...

  9. linux命令df中df -h和df -i

    df 命令: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [ ...

  10. 【已解决】报异常:java.lang.ArithmeticException: / by zero

    异常名称如下:java.lang.ArithmeticException: / by zero 原因:当我们定义的被除数为整形时候(short  int  long)会抛出此异常,被除数为整形时不可以 ...