发了题解。。
我们用map[][]存图
然后对于f[i][j]我们用来表示
到矩阵的第i行第j列可以构造最大为多少的正方形
所以初始化很容易得出 每一个格自身一开始都可以构成一个正方形
因此在读入的时候把每一个f[i][j]设为1
然后我们要取正方形 所以状态转移方程为
fij=min(f(i−1)j,min(fi(j−1),f(i−1)(j−1))+1
并且要满足map[i - 1][j] != map[i][j] && map[i][j - 1] != map[i][j] && map[i -1][j - 1] == map[i][j]也就是题目要求
然后每次更新ans 取f[][]中的最大值就可以了
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
#define in = read();
typedef long long ll;
typedef unsigned int ui;
const ll size = 1500 + 10;
int n , m;
int map[size][size];
int ans = 1;
int f[size][size];
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
int main(){
n in; m in;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++){
map[i][j] in;
f[i][j] = 1;
}
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++)
if(map[i - 1][j] != map[i][j] && map[i][j - 1] != map[i][j] && map[i -1][j - 1] == map[i][j]){
f[i][j] = min(f[i - 1][j] , min(f[i][j -1] , f[i - 1][j - 1])) + 1;
ans = max(ans , f[i][j]);
}
/*
cout<<endl;
for(register int i=1;i<=n;i++){
for(register int j=1;j<=m;j++)
cout<<f[i][j]<<" ";
cout<<endl;
}*/
printf("%d" , ans);
}
//COYG