洛谷P1387 最大正方形

简介: 题目描述题目链接:https://www.luogu.org/problemnew/show/P1387在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。输入输出格式输入格式: 输入文件第一行为两个整数n,m(1

题目描述

题目链接: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)

注意边界情况即可。

 

 1 #include<stdio.h>
 2 #define MAXN 100
 3 #define MAXM 100
 4 int array[MAXN+1][MAXM+1]={0};
 5 int maxSize[MAXN+1][MAXM+1]={0};
 6 int leftNum1[MAXN+1][MAXM+1]={0};
 7 int upNum1[MAXN+1][MAXM+1]={0};
 8 int n,m;
 9 int Figure(int tempN,int tempM)
10 {
11     if(tempN-1==0||tempM-1==0||array[tempN-1][tempM-1]==0)
12         return 1;
13     int min=maxSize[tempN-1][tempM-1]+1;
14     if(leftNum1[tempN][tempM]+1<min)
15         min=leftNum1[tempN][tempM]+1;
16     if(upNum1[tempN][tempM]+1<min)
17         min=upNum1[tempN][tempM]+1;
18     return min;
19 }
20 void tPrint()
21 {
22 /*    int i,j;
23     printf("\n");
24     for(i=1;i<=n;i++)
25     {
26         for(j=1;j<=m;j++)
27             //printf("%d ",[i][j]);
28             printf("%d ",upNum1[i][j]);//==============
29         printf("\n");
30     }
31     printf("\n");*/
32 }
33 int main()
34 {
35     int i,j;
36     scanf("%d%d",&n,&m);
37     int maxans=0;
38     for(i=1;i<=n;i++)
39         for(j=1;j<=m;j++)
40             scanf("%d",&array[i][j]);
41     for(i=1;i<=n;i++)
42         for(j=1;j<=m;j++)
43         {
44             if(j==1||array[i][j]==0)
45                 leftNum1[i][j]=0;
46             else
47             {
48                 if(array[i][j-1]==0)
49                     leftNum1[i][j]=0;
50                 else
51                     leftNum1[i][j]=leftNum1[i][j-1]+1;
52             }
53             
54             if(i==1||array[i][j]==0)
55                 upNum1[i][j]=0;
56             else
57             {
58                 if(array[i-1][j]==0)
59                     upNum1[i][j]=0;
60                 else
61                     upNum1[i][j]=upNum1[i-1][j]+1;
62             }
63         }
64     for(i=1;i<=n;i++)
65         for(j=1;j<=m;j++)
66         {
67             maxSize[i][j]=Figure(i,j);
68             if(maxSize[i][j]>maxans)
69                 maxans=maxSize[i][j];
70         }
71     tPrint();
72     printf("%d\n",maxans);
73     return 0;
74 }

类似参考题目: 

洛谷P1736 创意吃鱼法  题解

 

相关文章
|
小程序 容器
【微信小程序】-- WXML 模板语法 - 条件渲染 -- wx:if & hidden (十一)
【微信小程序】-- WXML 模板语法 - 条件渲染 -- wx:if & hidden (十一)
|
6月前
|
存储 消息中间件 Kafka
中原银行实时场景企业级解决方案
中原银行实时数据开发平台负责人杜威科在Flink Forward Asia 2024分享了银行业实时数据处理的经验。内容涵盖需求分析、解决方案、场景案例与现状展望。银行业需构建全链路、全场景的企业级实时数据平台,解决动账场景下的复杂计算需求。通过Flink+Paimon方案,实现高效更新、低成本存储与便捷查询。案例包括账户表实时更新入湖、交易协同优化、实时图应用、海量数据存储及业务人员易用性建设。未来目标是实现上千张表实时入湖,缩短延迟并探索AI结合的新场景。
219 2
中原银行实时场景企业级解决方案
ly~
|
12月前
|
存储 缓存 前端开发
如何优化 FileRun 以提高系统响应速度?
为了提高 FileRun 的系统响应速度,可以从服务器硬件、软件配置、系统设置和前端优化四个方面入手。硬件方面,升级服务器配置和网络带宽;软件方面,选择合适的 PHP 版本、优化数据库配置、启用缓存;系统设置方面,调整文件上传下载参数、禁用不必要的功能、定期清理文件系统;前端方面,优化页面加载和使用异步加载技术。
ly~
217 7
|
机器学习/深度学习 数据采集 算法
基于CNN卷积神经网络的调制信号识别算法matlab仿真
基于CNN卷积神经网络的调制信号识别算法matlab仿真
|
11月前
|
监控 数据挖掘 物联网
固定资产精细化管理系统-资产全生命周期数字化管理
华汇数据固定资产精细化管理系统是现代企对资产从购置、使用、维护到报废的全生命周期管理。对于资产规模庞大、设备种类繁多的中大型企业而言,其重要性尤为凸显。
163 1
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
8896 19
【DFS(深度优先搜索)详解】看这一篇就够啦
|
分布式计算 DataWorks 数据管理
DataWorks操作报错合集之写入ODPS目的表时遇到脏数据报错,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
393 0
|
Oracle 关系型数据库
Oracle 19c OCP 认证考试 082 题库(第20题)- 2024年修正版
这是2024年修正版的Oracle 19c OCP认证题库,包含1Z0-082科目共90题,通过分数为60%,考试时间为150分钟。本文由CUUG原创整理,解析了题库中的第20题,并解释了实体关系相关概念。获得OCP认证需通过082和083两门考试。
202 1
|
Java 应用服务中间件
SpringBoot 项目war包部署 配置外置tomcat方法
SpringBoot 项目war包部署 配置外置tomcat方法
330 0
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow和PyTorch的实际应用比较
TensorFlow和PyTorch的实际应用比较
265 2