用搜索最坏情况小于1e10,一般不会超时。
这里需要一个技巧,f[i][j]表示在i,j点的最大正方形边长,通过画图推导出转移方程。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
int n,m,a[101][101],f[101][101],maxx=0;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>a[i][j];
memset(f,0,sizeof(f));
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(a[i][j]==1)
f[i][j]=min(f[i-1][j],min(f[i-1][j-1],f[i][j-1]))+1;
else f[i][j]=0;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(f[i][j]>maxx)
maxx=f[i][j];
cout<<maxx;
return 0;
}