记忆化大失败
查看原帖
记忆化大失败
672360
Ch35楼主2022/7/12 11:05

不用记忆化搜索还能拿到90分,一用上记忆化搜索就只有30分

#include<bits/stdc++.h>
using namespace std;
int n,m,a[105][105],b[105][105],maxx,cnt=0,dp[100][100],maxx2;
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){
        if(dp[x-1][y]==0){
            b[x-1][y]=1;
        cnt++;
        dfs(x-1,y);
        b[x-1][y]=0;
        cnt--;
        }
        else {cnt+=dp[x-1][y],maxx=max(maxx,cnt),cnt-=dp[x-1][y];return;}
    }
    if(y-1>0&&a[x][y]>a[x][y-1]&&b[x][y-1]==0){
        if(dp[x][y-1]==0){
            b[x][y-1]=1;
            cnt++;
            dfs(x,y-1);
            b[x][y-1]=0;
            cnt--;
        }
        else {cnt+=dp[x][y-1],maxx=max(maxx,cnt),cnt-=dp[x][y-1];return;}
    }
    if(y+1<=m&&a[x][y]>a[x][y+1]&&b[x][y+1]==0){
        if(dp[x][y+1]==0){
            b[x][y+1]=1;
        cnt++;
        dfs(x,y+1);
        b[x][y+1]=0;
        cnt--;
        }
        else {cnt+=dp[x][y+1],maxx=max(maxx,cnt),cnt-=dp[x][y+1];return;}
    }
    if(x+1<=n&&a[x][y]>a[x+1][y]&&b[x+1][y]==0){
        if(dp[x+1][y]==0){
            b[x+1][y]=1;
        cnt++;
        dfs(x+1,y);
        b[x+1][y]=0;
        cnt--;
        }
        else {cnt+=dp[x+1][y],maxx=max(maxx,cnt),cnt-=dp[x+1][y];return;}
    }
    dp[x][y]=maxx;
}
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;
}
2022/7/12 11:05
加载中...