文章目录
- DFS
- 滑行(DFS+ 记忆搜索)
思路:
- 要思考回溯怎么写(入参与返回值、递归到哪里,递归的边界和入口)
DFS
滑行(DFS+ 记忆搜索)
代码分析:
- 学会将输入的数据用二维列表保存
- 对于递归函数的输入就用 坐标,返回值就用 实际的步数 ,这样可以方便后面的递归
- 用一个cache 二维列表来记录结果,避免重复的运算
import os
import sys
n, m = map(int, input().split())
lst = [list(map(int, input().split())) for _ in range(n)]
# 递归搜索 + 保存计算结果(后面不再运算重复路线) = 记忆化搜索
cache = [[-1] * m for _ in range(n)]
# 记忆化搜索: -1代表没记录当前位置所能达到的最远距离,其他值代表已经记录了当前位置所能达到的最远距离并且就是记录的就是当前位置最远距离
def dfs(x, y): # 当前位置所能达到的最远距离
if cache[x][y] != -1: # 如果被记录过了
return cache[x][y] # 就不再往下计算了,并且返回当前位置所能达到的最远距离
ans = 1
for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
xx = dx + x
yy = dy + y
if 0 <= xx < n and 0 <= yy < m and lst[xx][yy] < lst[x][y]:
ans = max(dfs(xx, yy) + 1, ans)
cache[x][y] = ans # 每次走到尽头了就记录一下当前这条路线走了几步(距离)
return ans # 返回当前位置所能达到的最远距离
res = 0
for i in range(n):
for j in range(m):
res = max(dfs(i, j), res)
print(res)