hongshikaikai @ 2024-12-21 12:45:05
双dp
#include <bits/stdc++.h>
using namespace std;
int n,m,mp[2505][2505],dp1[2505][2505],dp2[2505][2505],ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&mp[i][j]);
if(mp[i][j]==1){
int a=1;
for(int k=1;k<=dp1[i-1][j+1];k++){
if(mp[i-k][j]==1){
a=0;
break;
}
}
if(a==1){
for(int k=1;k<=dp1[i-1][j+1];k++){
if(mp[i][j+k]==1){
a=0;
break;
}
}
}
dp1[i][j]=a*(dp1[i-1][j+1])+1;
}
ans=max(ans,dp1[i][j]);
}
}
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
if(mp[i][j]==1){
int a=1;
for(int k=1;k<=dp2[i+1][j+1];k++){
if(mp[i+k][j]==1){
a=0;
break;
}
}
if(a==1){
for(int k=1;k<=dp2[i+1][j+1];k++){
if(mp[i][j+k]==1){
a=0;
break;
}
}
}
dp2[i][j]=a*(dp2[i+1][j+1])+1;
ans=max(ans,dp2[i][j]);
}
}
}
printf("%d\n",ans);
return 0;
}