题目描述

题目链接: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. 【BZOJ】【3697】采药人的路径&【3127】【USACO2013 Open】Yin and Yang

    点分治 Orz hzwer 倒是比较好想到点分治……然而在方案统计这里,我犯了两个错误…… 1.我比较傻逼的想的是:通过儿子来更新父亲,也就是统计以x为根的子树中xxxx的路径有多少条……这样转移. ...

  2. 接收连接basic_socket_acceptor

    概述 TCP有一处和UDP不同的地方是TCP是面向连接的,TCP有建立连接.通信.关闭连接的操作,Boost.Asio提供了ip::tcp::acceptor用来接收新的TCP连接,底层由socket ...

  3. Js计算指定日期加上多少天,加多少月,加多少年的日期

    function DateAdd(interval,number,date) { /* * 功能:实现VBScript的DateAdd功能. * 参数:interval,字符串表达式,表示要添加的时间 ...

  4. 从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现

    http://blog.csdn.net/dark_scope/article/details/17228643 〇.说明 本文的所有代码均可在 DML 找到,欢迎点星星. 一.引入 推荐系统(主要是 ...

  5. Spark简介及其在ubuntu下的安装使用

    转:http://blog.csdn.net/pelick/article/details/9888311 Spark概述 Spark是一种与 Hadoop 相似的开源集群计算环境,在性能和迭代计算上 ...

  6. redis 基本性能测试说明

    http://ghoulich.xninja.org/2016/11/17/how-to-use-redis-benchmark-to-measure-performance/

  7. CHtmlEditCtrl (3): More HTML Editor Options

    In this version of our HTML Editor, we'll create a floating source view/edit window and we'll implem ...

  8. junit与spring-data-redis 版本对应成功的

    spring-data-redis  版本:1.7.2.RELEASE junit 版本:4.12

  9. .Net Framework System.Collections 集合类

    本文内容 集合类 性能 最近复习了一下集合,C# 关于集合的类蛮多,但我除了 List 那几个经常用之外,其他的用得还真不多(只在小范围使用),但其实,每个集合类都各有自己适用的场景,功能也很强大.尤 ...

  10. 面试小结之Elasticsearch篇

    https://www.cnblogs.com/luckcs/articles/7052932.html