题目描述
在一个 n×mn\times mn×m 的只包含 000 和 111 的矩阵里找出一个不包含 000 的最大正方形,输出边长。
输入格式
输入文件第一行为两个整数 n,m(1≤n,m≤100)n,m(1\leq n,m\leq 100)n,m(1≤n,m≤100),接下来 nnn 行,每行 mmm 个数字,用空格隔开,000 或 111。
输出格式
一个整数,最大正方形的边长。
思路
dp[i][j]为i,j位置上最大的正方形的边长,它取决于右边的位置最大正方形的边长和下边位置最大正方形的边长,这两个位置边长取最小值再与右下方边长取最小值,最后+1,即为当前位置最大正方形的边长
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int maxis[maxn][maxn];
int dp[maxn][maxn];
int main()
{
int n, m;
cin>>n>>m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
cin >> maxis[i][j];
dp[i][j] = maxis[i][j];
}
int maxnn = -1;
for(int i = 2; i <= n; i++)
{
for(int j = 2; j <= m; j++)
{
if(maxis[i][j] == 1)
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
maxnn = max(maxnn, dp[i][j]);
}
}
cout<<maxnn;
}