思路: i j的最大正方形等于min(他的斜上方的的最大正方形,他的上方有的连续1,他的左方有的连续1)+1
#include<bits/stdc++.h> using namespace std; const int INF=10000000; int mp[205][205]; int dp[205][205]; int main(){ int n,m; cin>>n>>m; int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&mp[i][j]); if(mp[i][j]==1)dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1; ans=max(ans,dp[i][j]); } } cout<<ans<<endl; return 0; }