前缀和+搜索52分是为什么啊???

P1736 创意吃鱼法

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函数


|