https://www.luogu.org/problemnew/show/P1736?tdsourcetag=s_pctim_aiomsg
找出最大的单位阵E
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
//typedef long long ll;
const int maxn=2609;
int u[maxn][maxn];//i,j点以上有几个连续的0
int l[maxn][maxn];//i,j点以左/右有几个连续的0
int dp[maxn][maxn],a[maxn][maxn];
int main()
{
int n,m;
int maxx=0;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
scanf("%d",&a[i][j]);
if(!a[i][j])
u[i+1][j]=u[i][j]+1,l[i][j+1]=l[i][j]+1;
else
dp[i][j]=min(dp[i-1][j-1],min(u[i][j],l[i][j]))+1,maxx=max(maxx,dp[i][j]);
}
// memset(dp,0,sizeof(dp));此行没必要
for(int i=1; i<=n; i++)
for(int j=m; j>=1; j--)
if(!a[i][j])
u[i+1][j]=u[i][j]+1,
l[i][j-1]=l[i][j]+1;
else
{
u[i+1][j]=0,l[i][j-1]=0;
dp[i][j]=min(dp[i-1][j+1],min(u[i][j],l[i][j]))+1,maxx=max(maxx,dp[i][j]);
}
printf("%d\n",maxx);
}