输入
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
输出
25
原题链接:P1434 [SHOI2002]滑雪
采用记忆化搜索
以下是C代码
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int n, m, a[201][201], remember[201][201], ans;
int _max(int a, int b) {
return a > b ? a : b;
}
int dfs(int x, int y) //计算当前这个点能滑多远
{
if (remember[x][y]) return remember[x][y];//如果这个点被计算过,直接返回它的值
remember[x][y] = 1;//每个点最初都是1,走到这里说明没被计算过,那就先给它赋值
for (int i = 0; i < 4; i++)
{
int xx = dx[i] + x;
int yy = dy[i] + y;//四个方向
if (xx > 0 && yy > 0 && xx <= n && yy <= m && a[x][y] > a[xx][yy]) {//确保要比较的点在矩阵内,并且这个点要比自己小
remember[x][y] = _max(remember[x][y], dfs(xx, yy) + 1);//在它比我小的前提下,它能滑的距离>=我能滑的距离,就更新我目前能滑的最大距离
}
}
return remember[x][y];
}
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]);
for (int i = 1; i <= n; i++)//一个一个挨个找
for (int j = 1; j <= m; j++)
ans = _max(ans, dfs(i, j));//计算每一个点能滑的距离,不断的比较中,保留最大值
printf("%d", ans);
return 0;
}