原题链接:传送门
题意:在一片雪地,能从高处滑到低处。问一次最多可以划多远的距离。
记忆化搜索的入门题。
#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;
}