Capitalism_Gao @ 2020-01-10 14:03:57
没有TLE,WA了一半
#include<bits/stdc++.h>
using namespace std;
const int maxn=2510;
int n,m,ans,sum[maxn][maxn];
bool a[maxn][maxn];
inline bool check(int stx,int sty,int i,int j){
bool f=1;
for(int q=stx;q<=i;q++)
if(sum[q][j]-sum[q][sty-1]!=1){
f=0;break;
}
if(f) return true;
return false;
}
void dfs(int stx,int sty,int i,int j,int cnt){
ans=max(ans,cnt);
if(i+1<=n&&j+1<=m&&a[i+1][j+1])
if(check(stx,sty,i+1,j+1))
dfs(stx,sty,i+1,j+1,cnt+1);
}
inline bool judge(int stx,int sty,int i,int j){
bool f=1;
for(int q=stx;q<=i;q++)
if(sum[q][sty]-sum[q][j-1]!=1){
f=0;break;
}
if(f) return true;
return false;
}
void search(int stx,int sty,int i,int j,int cnt){
ans=max(ans,cnt);
if(i+1<=n&&j-1>=1&&a[i+1][j-1])
if(judge(stx,sty,i+1,j-1))
dfs(stx,sty,i+1,j-1,cnt+1);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
sum[i][j]=sum[i][j-1]+a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]) dfs(i,j,i,j,1);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]) search(i,j,i,j,1);
}
}
printf("%d",ans);
return 0;
}
by frsjth @ 2020-02-15 20:26:04
对角线有两条?
by Nightmare丶 @ 2020-02-26 00:37:27
你search函数调用的是dfs,应该递归search函数