yhr2013 @ 2025-01-11 14:40:35
#include<iostream>
#include<cstring>
using namespace std;
int n,m,a[2505][2505],dp[2505][2505],dp1[2505][2505],dp2[2505][2505],b[2505][2505];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
dp1[0][0]=dp2[0][0]=0;
for(int i=1;i<=m;i++){
dp1[1][i]=0;
}
for(int i=1;i<=n;i++){
dp2[i][1]=0;
}
for(int i=1;i<=m;i++){
if(a[1][i-1]==0)dp1[1][i]=dp1[1][i-1]+1;
else dp1[1][i]=0;
}
for(int i=1;i<=n;i++){
if(a[i-1][1]==0) dp2[i][1]=dp2[i-1][1]+1;
else dp2[i][1]=0;
}
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
if(a[i][j-1]==0) dp1[i][j]=dp1[i][j-1]+1;
else dp1[i][j]=0;
if(a[i-1][j]==0) dp2[i][j]=dp2[i-1][j]+1;
else dp2[i][j]=0;
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0){
dp[i][j]=0;
}
else dp[i][j]=min(dp[i-1][j-1],min(dp1[i][j],dp2[i][j]))+1;
ans=max(ans,dp[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
b[i][n-j+1]=a[i][j];
}
for(int j=1;j<=m;j++) a[i][j]=b[i][j];
}
memset(dp,0,sizeof(dp));
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
for(int i=1;i<=m;i++){
dp1[1][i]=0;
}
for(int i=1;i<=n;i++){
dp2[i][1]=0;
}
for(int i=1;i<=m;i++){
if(a[1][i-1]==0)dp1[1][i]=dp1[1][i-1]+1;
else dp1[1][i]=0;
}
for(int i=1;i<=n;i++){
if(a[i-1][1]==0) dp2[i][1]=dp2[i-1][1]+1;
else dp2[i][1]=0;
}
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
if(a[i][j-1]==0) dp1[i][j]=dp1[i][j-1]+1;
else dp1[i][j]=0;
if(a[i-1][j]==0) dp2[i][j]=dp2[i-1][j]+1;
else dp2[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0){
dp[i][j]=0;
}
else dp[i][j]=min(dp[i-1][j-1],min(dp1[i][j],dp2[i][j]))+1;
ans=max(ans,dp[i][j]);
}
}
cout<<ans;
}
WA on #5