太经典的一道题了,体现了记忆化搜索的优势所在。
我们建立一个memo数组,表示在相应点对应的最长滑雪长度,那么之后再访问这个节点,就可以直接返回这个数组存储的值,这可以大大提高搜索的效率。
就这道题而言,不加如下语句的时间为:9964ms,加上后为:43ms。
if memo[x][y]:
return
这就已经很显然地说明了记忆化搜索的高效性。
代码如下~
dir = [(-1, 0), (0, -1), (1, 0), (0, 1)]
def dfs(x, y):
if memo[x][y]:
return
for a, b in dir:
nx, ny = x+a, y+b
if matrix[nx][ny] < matrix[x][y]:
dfs(nx, ny)
memo[x][y] = max(memo[x][y], memo[nx][ny]+1)
r, c = map(int, input().split())
matrix = ([[float('inf') for _ in range(c+2)]]+
[[float('inf')]+list(map(int, input().split()))+[float('inf')] for _ in range(r)]+
[[float('inf') for _ in range(c+2)]])
memo = [[0 for _ in range(c+1)] for _ in range(r+1)]
for i in range(1, r+1):
for j in range(1, c+1):
dfs(i, j)
print(max(max(memo[p]) for p in range(1, r+1))+1)