解题思路:
利用动态规划的思想设置一个标记数组flag[][],flag[i][j]用来记录矩阵op[][]中以op[i][j]为右下角的子矩阵中最大的正方形边长,那么动态方程就是 flag[i][j]=min(flag[i-1][j],min(flag[i-1][j-1],flag[i][j-1]))+1;左侧和上方以及左上方中最小值+1
#include<bits/stdc++.h>
using namespace std;
int op[109][109];
int flag[109][109];
int main(void){
int n,m;
int ans=0;
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>op[i][j];
if(op[i][j]==1){
flag[i][j]=min(flag[i-1][j],min(flag[i-1][j-1],flag[i][j-1]))+1;
ans=max(ans,flag[i][j]);
}
}
}
cout<<ans;
return 0;
}