思路:
对于矩阵中的每一个元素,处理出它能扩展到的上边界$up$、左边界$left$,DP得出以该元素为右下角的最大正方形。
状态转移方程:$f_{i,j}=min(f_{i-1,j-1},up_{i,j},left_{i,j})$。
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7ffffffe;
int main() {
int n=getint(),m=getint();
bool a[][m+];
int up[][m+],left[][m+],f[][m+];
f[][]=inf;
for(register int i=;i<=m;i++) f[][i]=inf;
int ans=;
for(register int i=;i<=n;i++) {
for(register int j=;j<=m;j++) {
a[i&][j]=getint();
up[i&][j]=(i==||a[i&][j]==a[!(i&)][j])?:(up[!(i&)][j]+);
left[i&][j]=(j==||a[i&][j]==a[i&][j-])?:(left[i&][j-]+);
f[i&][j]=std::min(f[!(i&)][j-]+,std::min(up[i&][j],left[i&][j]));
ans=std::max(ans,f[i&][j]);
}
}
printf("%d\n",ans);
return ;
}