最详细的分步详解 洛谷P1387 最大正方形

题目传送门:P1387 最大正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)写在前面:该题需要用到动态规划解决,没学过的朋友可以先去学习动态规划首先看到这道题,我第一时间想到的是使用枚举解决。首先思考一下如果本题使用枚举如何解决:我们开一个二维数组f,其中f[i][j]表示正方形以(i,j)坐标为右下顶点的最大边长那么对于每一个输入的值为1的(i,j),它的f[i][j]我们都需要枚举出1~i 与1~n的所有值,再进行判断显然时间复杂度是,这对于本题的限制
摘要由CSDN通过智能技术生成

题目传送门:P1387 最大正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

写在前面:该题需要用到动态规划解决,没学过的朋友可以先去学习动态规划


首先看到这道题,我第一时间想到的是使用枚举解决。

首先思考一下如果本题使用枚举如何解决:

我们开一个二维数组f,其中f[i][j]表示正方形以(i,j)坐标为右下顶点的最大边长

那么对于每一个输入的值为1的(i,j),它的f[i][j]我们都需要枚举出1~i 与1~n的所有值,再进行判断

显然时间复杂度是O(n^3),这对于本题的限制 n,m<=100 来说必定超时


仔细读题,不难发现,需要使用动态规划解决本问题

具体步骤如下:

同样的,我们开一个二维数组f,其中f[i][j]表示正方形以(i,j)坐标为右下顶点的最大边长

同时,我们开一个二维数组a来记录每个点输入进来的值

int a[110][110];
int f[110][110];
//数组数量尽量开得比n大一点
int n; //用于记录输入的n

读入数据

scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
         scanf("%d",&a[i][j]);

如果 a[i][j]==0 显然不可能存在正方形以(i,j)为右下顶点,所以f[i][j]=0

但看题目,我们依然无法列出转移方程与判断条件,那么我们不妨实际模拟一下输入与输出:

当程序输入:

5 5

1 1 1 1 1

1 1 1 0 1

1 1 1 1 1

1 1 1 1 1

1 1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值