1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减…
题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍 求最大子矩阵(悬线法模板) 把每个格子向上延伸的空格看做一条悬线 以le[i][j],re[i][j],up[i][j]分别记录该悬线向左,向右的运动极限以及向上的延伸长度 ans=max(ans,(up[i][j]*(re[i][j]-le[i][j]+1))); #include<cstdio> #include<iostream> #include<cstring> #include<…
P4147 玉蟾宫 悬线法 ,\(l_{i,j},r_{i,j},up_{i,j}\) 分别表示 \((i,j)\) 这个点向左,右,上能到达的远点.然后面积就很好办了.具体实现见代码. 然而,还有更优秀的算法,可是我还没学会嘤嘤嘤,可以看看这题:P1578 奶牛浴场 #include<bits/stdc++.h> using namespace std; const int N=1005; int a[N][N],l[N][N],r[N][N],n,m,mp[N][N],ans; int r…
3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda.现在freda要在这里卖萌...它要找一块矩形土地,要求这片土地都标着'…
http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右边的位置都记录的话这题就可以解决了. 学习了一种新算法很开心. Cut the cake Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 8…
首先预处理每个F点左右,下一共有多少个F点,然后 对于每个为0的点(R),从这个点开始,一直到这个点 下面第一个R点,这一区间中的min(左),min(右)更新答案. ps:我估计这道题数据有的格式不对,开始过不去,后来改了读入 就能过了 /**************************************************************     Problem:     User: BLADEVIL     Language: Pascal     Result: A…
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要在这里卖…
对于第一问, 简单的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.…
传送门 对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案. 代码: #include<bits/stdc++.h> #define M 1005 using namespace std; int n,x,y,a[M][M],b[M][M],L[M][M],R[M][M],h[M][M],sum[M][M],lpos[M][M],rpos[M][M],ans1=0,ans2=0; char s[4]; inlin…
题目 传送门:QWQ 分析 以前见到过差不多的这题. xhk说是单调栈水题,但我又不会单调栈,于是当时就放下了. 这么久过去了我还是不会用单调栈做这题,用的是悬线法. 非常好写 代码 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; int up[maxn][maxn], left[maxn][maxn], right[maxn][maxn], A[maxn]…
题意 其实就是BZOJ3039 不过没权限号(粗鄙之语) 同时也是洛谷4147 就是求最大子矩阵然后*3 思路 悬线法 有个博客讲的不错https://blog.csdn.net/u012288458/article/details/48197727 GREED-VI大佬之前也讲过,友链一下https://www.cnblogs.com/GREED-VI/p/9887399.html (他说的其实是悬线法,扫描线和这个不一样的吧) 代码 水水水 #include<cstdio> #includ…
https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[2000][2000][2]维护这个位置向上向左扩充的矩阵最大长度之后n²扫一遍,但是写起来发现并不能有效的扩充,也就是状态转移方程很难写出来. 后来发现有一种奥妙重重的方法叫做悬线法,把我原本向左向上扩充的过程改为记录每一个点向左向右向上的最大长度,这些状态很显然可以通过扫一遍的方法求出来,然后对于每…
悬线法是一种更优秀的枚举方式,保证了枚举悬线的集合包含了极大子矩形所在的集合,而且由最大子矩形一定是极大子矩形的定理可知,这种枚举方式可以求出最大子矩形. 具体做法是维护矩形中每个元素对应最近的左边和右边的障碍点,再维护一个高度数组记录下每个点向上可以延伸多高,还有对应的矩形向左向右可以到达的最大宽度. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e3+10; int n,m,a[maxn][maxn];…
P1169 [ZJOI2007]棋盘制作 给出一个 \(N * M\) 的 \(01\) 矩阵, 求最大的正方形和最大的矩形交错子矩阵 \(n , m \leq 2000\) 悬线法 悬线法可以求出给定矩阵中满足条件的最大子矩阵 对于每个点, 维护 两条等长的线段, 两线段的底部达到此点的纵坐标, 分别代表能从这个点达到的最左 / 最右端点 大概长这样 l r | | | | | | | | | * | 那么枚举每个点的这两条线段, 不断用 \((r - l + 1) * dis\) 更新答案即…
题目链接:传送门 题目大意: 给出N*M的字符矩阵(由字符B/R组成),求符合下图条件的子矩阵的最大周长. 1 ≤ N,M ≤ 1000. 思路: 悬线法. #include <iostream> #include <cstring> #include <cstdio> using namespace std; ; int N, M; char mat[MAX_N][MAX_N]; int lef[MAX_N][MAX_N], rig[MAX_N][MAX_N], up…
题目链接:传送门 题目大意: 求由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…
题目 传送门: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],…
[题意]给定01矩阵,求最大全1子矩阵.n,m<=1000. [算法]动态规划(悬线法) [题解]★对于01矩阵中的任意一个全1极大子矩阵,都可以在其上边界遇到的障碍点处悬线到下边界的点x,则点x唯一对应了一个极大子矩阵,那么至多有n*m个极大子矩阵,而最大子矩阵一定是极大子矩阵,故求解复杂度O(nm). 预处理L[i][j]表示(i,j)向左延伸的最左位置,R[i][j]同理. 设h[i][j]表示(i,j)向上的悬线高度,l[i][j]表示(i,j)代表的极大子矩阵向左延伸的最左位置,r[i…
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6052 [题目大意] 给出一个数字矩阵,求子矩阵期望数字种数 [题解] 我们统计[x,y]为其所表示的数字的最左上方的矩形数量,即该格子的贡献值, 我们用悬线法将上边界上移,调整左右边界保证[x,y]为数字左上边界, 那么x及其以下的部分都可以作为下边界,顺序统计即可, 由于障碍点的顺序设置保证了二维的偏序性,不会出现重复统计贡献. [代码] #include <cstdio> #include…
Background 王7的生日到了,他的弟弟准备送他巧克力. Description 有一个被分成n*m格的巧克力盒,在(i,j)的位置上有a[i,j]块巧克力.就在送出它的前一天晚上,有老鼠夜袭巧克力盒,某些位置上被洗劫并且穿了洞.所以,你--王7的弟弟王9,必须从这个满目苍夷的盒子中切割出一个矩形巧克力盒,其中不能有被老鼠洗劫过的格子且使这个盒子里的巧克力尽量多. Input 第一行有两个整数 n.m.第 i+1行的第 j 个数表示a[ i , j ].如果这个数为 0 ,则表示这个位置的…
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内容部分参考@Clove_unique 悬线法 用途: 解决给定矩阵中满足条件的最大子矩阵 做法: 用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界 定义几个东西: \(left[i][j]\):代表从\((i,j)\)能到达的最左位置 \(right[i][j]\):代表从\((i,j)\)…
方法一 黑白棋盘拥有性质:(r + c) % 2的值决定颜色 因此把某色全部反转,直接求另一色的最大矩形即可,单调栈的经典问题 #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 2005; int n, m, a[maxn][maxn], h[maxn][maxn]; int ans…
参考:https://blog.csdn.net/twtsa/article/details/8120269 先给出题目来源:(洛谷) 1.p1387 最大正方形 2.P1169 棋盘制作 3.p2701 巨大的牛棚 4.p4147 玉蟾宫 5.P1578 奶牛浴场 ...... 悬线法,很好理解,就是悬一根线晃来晃去求最大子矩阵嘛! 思路和转移方程也很简单: if(满足^&%$!@#^%){ right[i][j]=min(right[i][j],right[i-][j]); left[i][…
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…
题目 悬线法的思想--即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界. 如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值. 考虑如何线性求出两个障碍的矩阵上下边界, 我们可以把障碍按x坐标排序,然后对于每个障碍,都找x比他大的障碍找一遍,也就是悬线向右扩展,每找一个就更新一下上边界或下边界也就是更新悬线的上下端点, 因为越向右,矩阵的上边界和下边界就逼近矩阵的宽减少,但是矩阵的长却是一直增大的,因此需要每次都更新最大值. 组成了…
悬线法DP总结 问题模型 求满足某种条件(如01交替)的最大矩形(正方形) 思想 先预处理出\(ml[i][j],mr[i][j],mt[i][j]\),分别表示当前位置\((i,j)\)能向左扩展到的最左边的编号.能向右扩展到的最右边的编号.能向上扩展到的最大高度. 然后在做\(DP\)时,除第一行,每行根据上一行的状态更新当前状态,逐行扫一遍.复杂度\(O(n\times m)\) 题 [USACO5.3]巨大的牛棚Big Barn 洛谷题面 题意:求最大正方形 #include <cstd…
题目:https://www.luogu.org/problemnew/show/P1169 题意:n*m的黑白格子,找到面积最大的黑白相间的正方形和矩形. 思路:传说中的悬线法!用下面这张图说明一下. 悬线法一般是用来求一个没有障碍点的最大子矩阵的.想象从上面垂下来好多的悬线,这些悬线被一个底所限制,并且可以左右移动但是也有范围限制. 现在某条悬线可以移动到的面积就是他能满足的子矩形的面积.比如我们已经处理好了$i-1$行,现在考虑$(i,j)$ 对于这道题来说,如果$grid[i][j]!=…
---恢复内容开始--- 给你一个矩阵,选出最大的棋盘,棋盘的要求是黑白相间(01不能相邻),求出最大的正方形和矩形棋盘的面积: 数据n,m<=2000; 这个一看就可能是n2DP,但是写不出.单走一波暴力(sb): 悬线法:就是将限制条件看成一根线,能扩展的最大长度,线要直: 矩形就是这样: 用l[i][j]表示i,j合法的情况下左边能延伸的坐标,r[i][j]是在右边能延伸的坐标: up[i][j]是能向上延长的长度: 预处理过后,以i,j作为下底边,用左右上能延伸的长度更新ans; #in…
Second Large Rectangle 题意 给出n*m的01矩阵,问由1组成的第二大的矩阵的大小是多少? 分析 单调栈(or 悬线法)入门题 单调栈 预处理出每一个点的最大高度,然后单调栈每一个点扫,一个点的左右高度不小于他的点就可以构成一个矩形,因此就可以求出矩形面积了. 悬线法 预处理每个点的连续最左边,最右边,和最上面.同时一个点的最左边要小于等于他的正上方那个点的最左边,右边同理,即要满足,高度优先,尽量取左右边界,这样就可以取遍所以的极大矩形了.…
例题 P1169 [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8×88 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则. 小Q找到了一张由N×MN \times MN×M个正方形的格子组成的矩形纸片,每个…