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