POJ 1088 滑雪(记忆化搜索)

原题链接:传送门

题意:在一片雪地,能从高处滑到低处。问一次最多可以划多远的距离。

记忆化搜索的入门题。


#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 105;
int Map[N][N],dp[N][N];
int Dir[4][2] = {1,0, 0,1, -1,0, 0,-1};
int n,m;

int dfs(int x,int y) {
    if(dp[x][y])        //若这个点已经搜过,直接返回其记录的值 
        return dp[x][y];
    int ret = 0;
    for(int i=0; i<4; i++) {
        int X = x + Dir[i][0];
        int Y = y + Dir[i][1];
        if(X >= 0 && X < n && Y >= 0 && Y < m && Map[X][Y] > Map[x][y]) {
            ret = max(ret,dfs(X,Y));    //这里Map[X][Y]和前一个点Map[x][y]比较时一定不能取等,否则会死循环
        }
    }
    return dp[x][y] = ret + 1;      //步数+1 
}

int main() {

    memset(dp,0,sizeof(dp));

    scanf("%d%d",&n,&m);
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            scanf("%d",&Map[i][j]);
        }
    }
    int ans = 0;
    for(int i=0; i<n; i++) {        //要把每个点作开始点来搜一次 
        for(int j=0; j<m; j++) {
            int temp = dfs(i,j);
            ans = ans > temp ? ans : temp;      //取路径最长的 
        }
    }
    printf("%d\n",ans);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_16554583/article/details/81118934