用搜索最壞情況小於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;
}