1159 最大全0子矩阵

时间限制: 1 s    空间限制: 128000 KB    题目等级 : 黄金 Gold

题目描述 Description

在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。

输入描述 Input Description

输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开。

输出描述 Output Description

输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数。

样例输入 Sample Input

5
0 1 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0

样例输出 Sample Output

9

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=;
int h[maxn][maxn],l[maxn][maxn],r[maxn][maxn];
int n,maxl,maxr,ans,martrix[maxn][maxn];
int main() {
scanf("%d",&n);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
scanf("%d",&martrix[i][j]);
for(int i=;i<=n;++i)
r[][i]=n;
for(int i=;i<=n;++i) {
maxr=n;
maxl=;
for(int j=;j<=n;++j)
if(martrix[i][j]) {
maxl=j+;
h[i][j]=l[i][j]=;
}
else {
h[i][j]=h[i-][j]+;
l[i][j]=max(maxl,l[i-][j]);
}
for(int j=n;j>;--j)
if(martrix[i][j]) {
maxr=j-;
r[i][j]=n;
}
else {
r[i][j]=min(maxr,r[i-][j]);
ans=max(ans,(r[i][j]-l[i][j]+)*h[i][j]);
}
}
printf("%d\n",ans);
return ;
}

看到这个题目的时候妥妥的蒙蔽了~~,按照正方形敲出来就A了一个点,题解居然是悬线法!!!!(跑去学了悬线法)

就是记录一下能扩展到的最靠左、右、上的边界,搞一下就出来了。。。

悬线法

时间复杂度O(NM) 空间复杂度O(NM)

定义

有效竖线:除了两个端点外,不覆盖任何一个障碍点的竖直线段。 
悬线:上端覆盖了一个障碍点或者到达整个矩形上边界的有效线段。 
每个悬线都与它底部的点一一对应,矩形中的每一个点(矩形顶部的点除外)都对应了一个悬线。 
悬线的个数=(N-1)*M; 
如果把一个极大子矩形按照横坐标的不同切割成多个与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-1,j] 
L[i,j]=max 
(i-1,j)左边第一个障碍点的位置 
•同理,也可以得到R[i,j]的递推式 
R[i-1,j] 
R[i,j]=min 
(i-1,j)右边第一个障碍点的位置

Codevs 1159 最大全0子矩阵 悬线法!!!!的更多相关文章

  1. [codevs1159]最大全0子矩阵(悬线法)

    解题关键:悬线法模板题.注意此模板用到了滚动数组. #include<cstdio> #include<cstring> #include<algorithm> # ...

  2. Codevs 1159 最大全0子矩阵

    1159 最大全0子矩阵  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 在一个0,1方阵中找出其中最大的全 ...

  3. CODE[VS] 1159 最大全0子矩阵

    写一道CODEVS的题目 其实我还是很喜欢CODEVS的界面的 主要是系统地学习一下悬线法这个看似十分简单,实际就是十分简单的算法 对于一些详细的东西参考dalao's blog,不喜勿喷 对于悬线法 ...

  4. BZOJ 3039: 玉蟾宫( 悬线法 )

    最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...

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

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

  6. City Game UVALive - 3029(悬线法求最大子矩阵)

    题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍 求最大子矩阵(悬线法模板) 把每个格子向上延伸的空格看做一条悬线 以le[i][j],re[i][j],up[i][j]分别 ...

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

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

  8. P4147 玉蟾宫(悬线法求最大子矩阵)

    P4147 玉蟾宫 悬线法 ,\(l_{i,j},r_{i,j},up_{i,j}\) 分别表示 \((i,j)\) 这个点向左,右,上能到达的远点.然后面积就很好办了.具体实现见代码. 然而,还有更 ...

  9. 【BZOJ】3039: 玉蟾宫 悬线法

    [题意]给定01矩阵,求最大全1子矩阵.n,m<=1000. [算法]动态规划(悬线法) [题解]★对于01矩阵中的任意一个全1极大子矩阵,都可以在其上边界遇到的障碍点处悬线到下边界的点x,则点 ...

随机推荐

  1. SpingBoot之配置文件的值注入问题

    我们在这里研究的是以yml配置文件值注入的问题: Person: lastName: 张三 age: 23 boss: false birth: 2018-10-11 maps: {k1: v1,k2 ...

  2. 项目实战8.2-Linux下Tomcat开启查看GC信息

    本文收录在Linux运维企业架构实战系列 转自https://www.cnblogs.com/along21/ 一.开启GC日志 1.在Tomcat 的安装路径下,找到bin/catalina.sh  ...

  3. java util - base64转换工具

    测试代码 package cn.java.codec.base64; public class Test { public static void main(String[] args) { Stri ...

  4. python3:判断手机的亮屏状态

    在用python对手机做一些自动化操作时,常常会判断手机的亮屏状态,知晓手机的亮屏状态后才好做进一步的动作,如给屏幕解锁等.  用于了解手机的亮屏情况,有一个adb命令可用: adb shell du ...

  5. 关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)

    一.需求 现有一个字符串str String str = "{\\\"name\\\":\\\"spy\\\",\\\"id\\\\&quo ...

  6. Linux 内核源码外编译 linux模块--编译驱动模块的基本方法

    1.先编写一个简单的hello模块,hello.c 源码如下: #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # defin ...

  7. 51nod 1267二分+优化试验场

    最初,最开始的时候,万能的学姐曾经警告过我们,千万别用什么老狮子MAP,手撸map或者字典树...当时不甚理解...今天...这题直接卡掉了我的MAP,但是使用朴素方法进行二分...不加优化,,都不需 ...

  8. [原]sencha touch之carousel

    carousel组件是个非常不错的东东,自带可滑动的效果,效果如下图 上面部分可以左右滑动,下面部分可以上下滑动,效果还是不错的,app程序中很有用的布局 代码如下: Ext.application( ...

  9. Beats、Filebea入门

    1. Filebeat配置简介 2. Filebeat收集nginx日志 3. packetbeat简介与演示

  10. loj2053 「HNOI2016」大数

    ref #include <algorithm> #include <iostream> #include <cstring> #include <cstdi ...