[P1169] 棋盘制作 &悬线法学习笔记
学习笔记 悬线法
最大子矩阵问题:
在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的,边与整个矩形平行或重合的最大子矩形。
极大子矩型:无法再向外拓展的有效子矩形
最大子矩型:最大的一个有效子矩形
特别的,在一个有障碍点的矩形中,最大子矩形一定是极大子矩形
悬线法
悬线:上端覆盖了一个障碍点或者到达整个矩形上边界的有效线段
每个悬线上的点的与底部的点一一对应,矩形中每一个点(矩形顶部点除外)都对应了一条悬线。
如果把一条悬线向左右两个方向尽可能的移动,那么就得到了一个矩形。
注意:悬线对应的矩型不一定是极大子矩阵,因为悬线定义中固定了悬线的下边界,故而,悬线左右移动所得到的矩形无法向下扩展。
悬线法的实现
三个重要的元素:
- heighti,j :表示以( i ,j )为底的悬线的高 (初始化为1)
- lefti,j :表示向左最多能移动到的位置 (初始化为j)
- 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] 棋盘制作 &悬线法学习笔记的更多相关文章
- 洛谷P1169 棋盘制作(悬线法)
题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...
- P1169 [ZJOI2007]棋盘制作 && 悬线法
P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给 ...
- 洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定 ...
- P1169 [ZJOI2007]棋盘制作[悬线法/二维dp]
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...
- P1169 [ZJOI2007]棋盘制作——悬线法
---恢复内容开始--- 给你一个矩阵,选出最大的棋盘,棋盘的要求是黑白相间(01不能相邻),求出最大的正方形和矩形棋盘的面积: 数据n,m<=2000; 这个一看就可能是n2DP,但是写不出. ...
- P1169 [ZJOI2007]棋盘制作 悬线法or单调栈
思路:悬线法\(or\)单调栈 提交:2次 错因:正方形面积取错了\(QwQ\) 题解: 悬线法 讲解:王知昆\(dalao\)的\(PPT\) 详见代码: #include<cstdio> ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...
- [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵
https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...
随机推荐
- 基于IdentityServer4 实现.NET Core的认证授权
IdentityServer4是什么? IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. OpenID ...
- Zookeeper注册中心和Dubbo-Admin管理平台的搭建
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- 菜鸟系列docker——docker基本概念(1)
docker基本概念 1.准备 这里先介绍容器技术,后续再介绍docker.docker是容器的一种,除docker以外,还存在coreos.不过在当前趋势下容器和docker基本上可以划为等号了. ...
- -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义
Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ...
- Python爬虫之使用celery加速爬虫
celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.关于celery的更多介绍及例子,笔者可以参考文章Python之celery的简介与使用. 本文将介绍 ...
- Java几种常见的设计模式
--------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...
- Spring框架基础(上)
spring是开源对轻量级框架 spring核心主要两部分 aop 面向切面编程,扩展功能不是修改源代码实现 aop采用横向抽取机制,取代了传统纵向继承体系重复代码(性能监视.事务管理.安全检查.缓存 ...
- LeetCode 176. 第二高的薪水(MySQL版)
0.前言 最近刷LeetCode 刷数据库题目 由于数据库课上的是SQL,而MySQL有许多自己的函数的,怕把刚学会的函数忘记 特在此记录! 1.题目 编写一个 SQL 查询,获取 Employee ...
- SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large –
SAP MM ME21N 创建PO时报错 - Net price in CNY becomes too large – 笔者所在的项目上,由于客户尚未正式大规模量产,在现阶段,所有的物料基本都是走费用 ...
- 转载: ssh连接上华为云Linux服务器,一会就自动断开
原文链接:https://www.cnblogs.com/mspeer/p/9907734.html 客户端向服务端发送心跳 依赖 ssh 客户端定时发送心跳,putty.SecureCRT.XShe ...