dfs大失败

P1434 [SHOI2002] 滑雪

_Niaoniao_ @ 2022-07-10 21:20:05

对5个点(把大于改为大于等于并添加新步骤0分)

#include<bits/stdc++.h>
using namespace std;
int n,m;
int sx[102][102],ax[102][102],dp[102][102],maxn;
int dfs(int x,int y){
    if(sx[x][y]>sx[x-1][y]){
        if(ax[x-1][y]==1){
            dp[x][y]=max(dp[x][y],dp[x-1][y]+1);
        }else{
            dp[x][y]=max(dp[x][y],dfs(x-1,y)+1);
        }
    }
    if(sx[x][y]>sx[x+1][y]){
        if(ax[x+1][y]==1){
            dp[x][y]=max(dp[x][y],dp[x+1][y]+1);
        }else{
            dp[x][y]=max(dp[x][y],dfs(x+1,y)+1);
        }
    }
    if(sx[x][y]>sx[x][y-1]){
        if(ax[x][y-1]==1){
            dp[x][y]=max(dp[x][y],dp[x][y-1]+1);
        }else{
            dp[x][y]=max(dp[x][y],dfs(x,y-1)+1);
        }
    }
    if(sx[x][y]>sx[x][y+1]){
        if(ax[x][y+1]==1){
            dp[x][y]=max(dp[x][y],dp[x][y+1]+1);
        }else{
            dp[x][y]=max(dp[x][y],dfs(x,y+1)+1);
        }
    }
    ax[x][y]=1;
    return dp[x][y];
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>sx[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            maxn=max(dfs(i,j),maxn);
        }
    }
    cout<<maxn<<endl;
    return 0;
}

by Ch35 @ 2022-07-12 10:49:48

@晓柚芋兹 我也是用dfs的,拿了个90分,我没用记忆化搜索,用了就100分了,你可以参考一下:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[105][105],b[105][105],maxx,cnt=0;
void dfs(int x,int y){
    maxx=max(maxx,cnt);
    if(x-1>0&&a[x][y]>a[x-1][y]&&b[x-1][y]==0){
        b[x-1][y]=1;
        cnt++;
        dfs(x-1,y);
        b[x-1][y]=0;
        cnt--;
    }
    if(y-1>0&&a[x][y]>a[x][y-1]&&b[x][y-1]==0){
        b[x][y-1]=1;
        cnt++;
        dfs(x,y-1);
        b[x][y-1]=0;
        cnt--;
    }
    if(y+1<=m&&a[x][y]>a[x][y+1]&&b[x][y+1]==0){
        b[x][y+1]=1;
        cnt++;
        dfs(x,y+1);
        b[x][y+1]=0;
        cnt--;
    }
    if(x+1<=n&&a[x][y]>a[x+1][y]&&b[x+1][y]==0){
        b[x+1][y]=1;
        cnt++;
        dfs(x+1,y);
        b[x+1][y]=0;
        cnt--;
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)cin>>a[i][j];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]>0){
            b[i][j]=1;
            dfs(i,j);
            for(int k=1;k<=n;k++){
               for(int l=1;l<=m;l++)b[k][l]=0;
           }
        }
        if(maxx+1==m*n){cout<<maxx+1;return 0;}
    }}
    cout<<maxx+1;
    return 0;
}

|