洛谷P1169 棋盘制作(悬线法)】的更多相关文章

题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define pqueue priority_queue #define NEW(a,b) memset(a…
学习笔记 悬线法 最大子矩阵问题: 在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的,边与整个矩形平行或重合的最大子矩形. 极大子矩型:无法再向外拓展的有效子矩形 最大子矩型:最大的一个有效子矩形 特别的,在一个有障碍点的矩形中,最大子矩形一定是极大子矩形 悬线法 悬线:上端覆盖了一个障碍点或者到达整个矩形上边界的有效线段 每个悬线上的点的与底部的点一一对应,矩形中每一个点(矩形顶部点除外)都对应了一条悬线. 如果把一条悬线向左右两个方向尽可能的移动,那么就得到了一个矩形. 注意:悬线对应…
P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定矩阵中满足条件的最大子矩阵 做法: 用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界 定义几个东西: left[i][j]left[i][j]:代表从(i,j)(i,j)能到达的最左位置 right[i][j]right[i][j]:代表从(i,j)(i,j)能到达的最右位置 up[i…
题目:https://www.luogu.org/problemnew/show/P1169 题意:n*m的黑白格子,找到面积最大的黑白相间的正方形和矩形. 思路:传说中的悬线法!用下面这张图说明一下. 悬线法一般是用来求一个没有障碍点的最大子矩阵的.想象从上面垂下来好多的悬线,这些悬线被一个底所限制,并且可以左右移动但是也有范围限制. 现在某条悬线可以移动到的面积就是他能满足的子矩形的面积.比如我们已经处理好了$i-1$行,现在考虑$(i,j)$ 对于这道题来说,如果$grid[i][j]!=…
P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给定矩阵中满足条件的最大子矩阵 对于每个点, 维护 两条等长的线段, 两线段的底部达到此点的纵坐标, 分别代表能从这个点达到的最左 / 最右端点 大概长这样 l r | | | | | | | | | * | 那么枚举每个点的这两条线段, 不断用 \((r - l + 1) * dis\) 更新答案即…
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则. 小Q找到了一张由N \times MN×M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减一部分作为新…
---恢复内容开始--- 给你一个矩阵,选出最大的棋盘,棋盘的要求是黑白相间(01不能相邻),求出最大的正方形和矩形棋盘的面积: 数据n,m<=2000; 这个一看就可能是n2DP,但是写不出.单走一波暴力(sb): 悬线法:就是将限制条件看成一根线,能扩展的最大长度,线要直: 矩形就是这样: 用l[i][j]表示i,j合法的情况下左边能延伸的坐标,r[i][j]是在右边能延伸的坐标: up[i][j]是能向上延长的长度: 预处理过后,以i,j作为下底边,用左右上能延伸的长度更新ans; #in…
思路:悬线法\(or\)单调栈 提交:2次 错因:正方形面积取错了\(QwQ\) 题解: 悬线法 讲解:王知昆\(dalao\)的\(PPT\) 详见代码: #include<cstdio> #include<iostream> #define ull unsigned long long #define ll long long #define R register int using namespace std; #define pause (for(R i=1;i<=1…
3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖…
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减…
https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[2000][2000][2]维护这个位置向上向左扩充的矩阵最大长度之后n²扫一遍,但是写起来发现并不能有效的扩充,也就是状态转移方程很难写出来. 后来发现有一种奥妙重重的方法叫做悬线法,把我原本向左向上扩充的过程改为记录每一个点向左向右向上的最大长度,这些状态很显然可以通过扫一遍的方法求出来,然后对于每…
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个 \(8 \times 8\) 大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则. 小Q找到了一张由 \(N \times M\) 个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减…
题面 这道题可以分成两部分来处理: 第一部分: 设f[i][j]表示右下角以(i,j)结尾的最大正方形的边长. 显然f[i][j]=min(f[i][j-1],f[i-1][j-1],f[i-1][j])+1 第二部分: 可以使用悬线法进行解决. 定义: 有效竖线:除了两个端点外,不覆盖任何障碍点的竖直线段. 悬线:上端点覆盖了一个障碍点或达到整个矩形上端的有效竖线.如图所示的三个有效竖线都是悬线 如果将一个悬线向左右两个方向尽可能移动所得到的有效子矩形称为这个悬线所对应的子矩形,那么所有悬线所…
悬线法,虽然得不到局部最优解,但是一定能得到全局最优解的算法,十分神奇~ #include <cstdio> #include <algorithm> #define N 2003 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,m,ans1,ans2; int v[N][N],l[N][N],r[N][N],up[N][N],len[N][N]; i…
次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵的最大值 那么我们定义3个数组 l[i][j]表示(i,j)能到达最左边的坐标 r[i][j]表示(i,j)能到达最右边的坐标 up[i][j]表示(i,j)能向上最大距离 即线的长度 那么状态转移方程得出: l[i][j]=max(l[i][j],l[i-][j]);//满足条件的最大值为左边(因…
和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169  p4147  p2701  p1387 #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; const int MAXN = 2…
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring> #include<iostream> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; inline int rd(){ ,f=;char c=ge…
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内容部分参考@Clove_unique 悬线法 用途: 解决给定矩阵中满足条件的最大子矩阵 做法: 用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界 定义几个东西: \(left[i][j]\):代表从\((i,j)\)能到达的最左位置 \(right[i][j]\):代表从\((i,j)\)…
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则. 小Q找到了一张由N \times MN×M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减一部分作为新…
2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的悬线法 论文:浅谈用极大化思想解决最大子矩形问题 H[i][j]表示(i,j)向上最长连续多少距离不出现障碍点(悬线) L[i][j]表示H[i][j]这根悬线最多可以向左移到什么位置 R[i][j]表示H[i][j]这根悬线最多可以向右移到什么位置 递推方式看代码吧,很好理解的 //棋盘制作 (Z…
对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) + 1 (假如(i, j)和右边和下边不冲突) 第二问就是经典的悬线法解决最大子矩阵了, 维护悬线H[i][j], 左边右边延伸的最长距离.先一行一行求出这一行的L, R, 然后再从上往下扫, 维护H, L, R 写完我才发现我脑残了...最大的正方形一定是在最大子矩阵里面啊...所以其实不用dp.…
题目 一道悬线法的裸题,悬线法主要是可以处理最大子矩阵的问题. 而这道题就是比较经典的可以用悬线法来处理的题. 而悬线法其实就是把矩阵中对应的每个位置上的元素分别向左向上向右,寻找到不能到达的地方,然后递推或者说是DP,这样在每次递推完之后就可以更新最小值了. \([height_{i, j}]\) :表示以\((i,j)\)为底的悬线的高 \([left_{i,j}]\) :表示向左最多能移动到的位置 \([right_{i,j}]\) :表示向右最多能移动到的位置 #include <ios…
题目链接:传送门 题目大意: 求由F构成的最大子矩阵的面积.输出面积的三倍. 1 ≤ N,M ≤ 1000. 思路: 悬线法模板题. #include <bits/stdc++.h> using namespace std; ; int N, M; char mat[MAX_N][MAX_N]; int lef[MAX_N][MAX_N], rig[MAX_N][MAX_N], up[MAX_N][MAX_N]; void init() { ; i <= N; i++) { ; j &l…
正解:单调栈/悬线法 解题报告: ummm这题我当初做的时候一点思路也没有只会暴力出奇迹:D(啊听说暴力好像能水过去呢,,, 然后当初是看的题解,然后学了下悬线法 然后就忘了:D 然后我现在看发现看不懂辽:D #论写题解的好处:D 所以赶紧来写个题解QAQ ummm悬线法这个玩意儿会单独写个学习笔记的到时候放链接QAQ所以这里不详解了 反正这题就相当于是个最大子矩阵的玩意儿?有点悬线法板子题的意思蛤? 那如果知道悬线法就可以直接过了,好了没了感觉没太多可说的QAQ 然而这题谢总是布置在单调栈专题…
传送门 悬线法板题. 如果只求最大矩形面积那么跟玉蟾宫是一道题. 现在要求最大正方形面积. 所以每次更新最大矩形面积时用矩形宽的平方更新一下正方形答案就行了. 代码: #include<bits/stdc++.h> #define N 2005 using namespace std; int n,m,a[N][N],L[N][N],R[N][N],h[N][N],ans=0,aans=0; int main(){ scanf("%d%d",&n,&m);…
题目 传送门:QWQ 分析 先把题目给出的矩阵变换一下,如果$ a[i][j] $中$ i+j \mod 2 = 1 $那么就对$ a[i][j] $取一下反. 接着就是求原图中最大的0.1子矩阵 详见lrj蓝书,悬线法维护最大0.1子矩阵. 代码 #include<bits/stdc++.h> #define left lft #define right rght using namespace std; ; int left[maxn][maxn], right[maxn][maxn],…
题目要求纵横坐标和奇偶性不同的点取值不同,于是我们把纵横坐标和奇偶性为1的点和0的点分别取反,就变成经典的最大全1子矩阵问题了,用悬线法解决. #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> using namespace std; ,inf=1e9; int n,m,ans1,ans2; int h[maxn],mp[maxn][maxn],l[maxn],r[…
洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看论文里面的“算法2“(那个是最大全0子矩阵方法,改一下就可以用在此题) #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; #d…
我不是题目的说 这道题运用了一种很巧妙的DP方式:悬线法 如图,蓝色为悬线,黄色为向两边延伸的长度 那么显然,最大子矩形的宽一定是这些黄线中最小的(证明从略) 所以我们可以维护三个数组: Up[i][j]表示向上延伸的长度 Left[i][j]表示向左能延伸到的最远横坐标 Right[i][j]表示向右能延伸到的最远横坐标 Code: #include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int n,m,maxR…
题目 悬线法的思想--即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界. 如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值. 考虑如何线性求出两个障碍的矩阵上下边界, 我们可以把障碍按x坐标排序,然后对于每个障碍,都找x比他大的障碍找一遍,也就是悬线向右扩展,每找一个就更新一下上边界或下边界也就是更新悬线的上下端点, 因为越向右,矩阵的上边界和下边界就逼近矩阵的宽减少,但是矩阵的长却是一直增大的,因此需要每次都更新最大值. 组成了…