题目描述

题目链接:https://www.luogu.org/problemnew/show/P1387

在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。

输入输出格式

输入格式:

输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.

输出格式:

一个整数,最大正方形的边长

输入输出样例

输入样例#1:

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

输出样例#1:

2

算法解析:

来源:http://www.cnblogs.com/CXSheng/p/7801313.html

本题也可以参考洛谷题解

动态规划,求什么设什么。

设maxSize[i][j] = 以a[i][j]为右下角的最大正方形边长,

则maxSize[i][j] = k代表着a[i][j]左上方k*k区域内的数字都是1,

起初我想,如果a[i][j]是1,那么就可以把maxSize[i-1][j-1]代表的一大片矩形的边长扩大1.

即maxSize[i][j]=

①  0 ,a[i-1][j-1]==0 or 边界;

②  maxSize[i-1][j-1]+1 , a[i-1][j-1]!=0;

但是!这是片面的,因为我忽略了a[i][j]正上方和正左方是否存在0的情况。

如图:

假设我们要求maxSize[i][j]对应着最右下角的红点,

浅蓝色的圈是maxSize[i-1][j-1]对结果的影响;

橙色的圈是a[i][j]正上方连续的1对结果的影响;

绿色的圈是a[i][j]正左方连续的1对结果的影响;

总图如下:

去三个值中最小的,记入maxSize[i][j]

综上可知,更新设定:

当a[i][j]为1时:

设maxSize[i][j] = 以a[i][j]为右下角的最大正方形边长,

LeftNum1[i][j] = a[i][j](不包括)正左边连续1的个数,

UpNum1[i][j] = a[i][j](不包括)正上方边连续1的个数,

于是maxSize[i][j] = min(maxSize[i-1][j-1]+1,leftNum1[i][j]+1,upNum1[i][j]+1)

注意边界情况即可。

 #include<stdio.h>
#define MAXN 100
#define MAXM 100
int array[MAXN+][MAXM+]={};
int maxSize[MAXN+][MAXM+]={};
int leftNum1[MAXN+][MAXM+]={};
int upNum1[MAXN+][MAXM+]={};
int n,m;
int Figure(int tempN,int tempM)
{
if(tempN-==||tempM-==||array[tempN-][tempM-]==)
return ;
int min=maxSize[tempN-][tempM-]+;
if(leftNum1[tempN][tempM]+<min)
min=leftNum1[tempN][tempM]+;
if(upNum1[tempN][tempM]+<min)
min=upNum1[tempN][tempM]+;
return min;
}
void tPrint()
{
/* int i,j;
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
//printf("%d ",[i][j]);
printf("%d ",upNum1[i][j]);//==============
printf("\n");
}
printf("\n");*/
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
int maxans=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%d",&array[i][j]);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
if(j==||array[i][j]==)
leftNum1[i][j]=;
else
{
if(array[i][j-]==)
leftNum1[i][j]=;
else
leftNum1[i][j]=leftNum1[i][j-]+;
} if(i==||array[i][j]==)
upNum1[i][j]=;
else
{
if(array[i-][j]==)
upNum1[i][j]=;
else
upNum1[i][j]=upNum1[i-][j]+;
}
}
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
maxSize[i][j]=Figure(i,j);
if(maxSize[i][j]>maxans)
maxans=maxSize[i][j];
}
tPrint();
printf("%d\n",maxans);
return ;
}

类似参考题目:

洛谷P1736 创意吃鱼法  题解

洛谷P1387 最大正方形的更多相关文章

  1. 洛谷 p1387最大正方形

    洛谷 p1387最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来 ...

  2. 洛谷 P1387 最大正方形 【dp】(经典)

    题目链接:https://www.luogu.org/problemnew/show/P1387 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入格式: 输入 ...

  3. 洛谷 P1387 最大正方形 Label:奇怪的解法

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  4. 洛谷 [P1387] 最大正方形

    本题非常有趣. (n^6) 枚举四个端点,每次遍历矩阵求解. (n^4) 先处理前缀和,枚举四个端点,每次比较前缀和和正方形面积. (n^3) 枚举左上方端点,在枚举边长,前缀和优化 (n^2logn ...

  5. 洛谷P1387最大正方形(dp,前缀和)

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  6. (Java实现) 洛谷 P1387 最大正方形

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  7. [洛谷1681]最大正方形II

    思路:对于矩阵中的每一个元素,处理出它能扩展到的上边界$up$.左边界$left$,DP得出以该元素为右下角的最大正方形.状态转移方程:$f_{i,j}=min(f_{i-1,j-1},up_{i,j ...

  8. 洛谷P1681 最大正方形II

    P1681 最大正方形II 题目背景 忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到 了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. spring mvc 接受前台json @RequestBody json 属性 空 使用 JsonProperty spring mvc 获取json转乘bean

    请给json序列序列化成的javabean 属性加上   @JsonProperty(value = "real_name")   否则 springmvc 可能接受不到数据 ja ...

  2. Altium Designer 13 插件安装

    关键词:Altium Designer 13 :导入 Protel 99SE 很多人反应Altium Designer 13等版本无法 Protel 99SE的文件,实际上这是由于新的安装机制导致,新 ...

  3. verilog语法实例学习(6)

    函数和任务 函数 https://wenku.baidu.com/view/d31d1ba8dd3383c4bb4cd283.html verilog中函数的目的是允许代码写成模块的方式而不是定义独立 ...

  4. 8 个基于 Lucene 的开源搜索引擎推荐

    Lucene是一种功能强大且被广泛使用的搜索引擎,以下列出了8种基于Lucene的搜索引擎,你可以想象它们有多么强大. 1. Apache Solr Solr 是一个高性能,采用Java5开发,基于L ...

  5. jQuery 重复加载,导致依赖于 jQuery的JS全部失效问题

    父页面引入子页面,子页面引入jQuery.js文件,父页面JS依赖jQuery.js   ,出现问题是,总提示JS对象无效.猜测jQuery加载顺序不是最早造成的. 父页面: 子页面: 从这里看 ,j ...

  6. Linux服务器安装zabbix监控平台

    zabbix是基于web界面的开源分布式监控平台,可以监控各种服务器的配置参数,支持自定义配置和自定义告警,并且可以实现邮件.短信等方式的告警,zabbix基本组件如下: zabbix_server: ...

  7. AngulerJS学习(五)按需动态载入文件

    在此之前我么年首先要先了解几个东西: $q 简单介绍: $q:主要解决的是异步编程的问题,是指描写叙述通过一个承诺行为与对象代表的异步运行的行动结果的交互.可能会也可能不会再不论什么时候完毕. 我们通 ...

  8. 【Spark】SparkStreaming-流处理-规则动态更新-解决方案

    SparkStreaming-流处理-规则动态更新-解决方案 image2017-10-27_11-10-53.png (1067×738) elasticsearch-head Elasticsea ...

  9. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(三)安装spark2.2.1

    如何搭建配置centos虚拟机请参考<Kafka:ZK+Kafka+Spark Streaming集群环境搭建(一)VMW安装四台CentOS,并实现本机与它们能交互,虚拟机内部实现可以上网.& ...

  10. (转)No row with the given identifier exists问题的解决

    产生此问题的原因:         有两张表,table1和table2.产生此问题的原因就是table1里做了关联<one-to-one>或者<many-to-one unique ...