在学习hello算法的时候遇到这样一道题
原作者给出的是基于动态规划的算法,但是貌似没有给出回溯的算法,于是我尝试着使用了DFS来给出问题的答案,代码如下。
def backtrack(i:int,j:int,grid:list[list[int]],
path:list[int],minpath:list[int],n:int,m:int):
if i==n and j==m:
if path[0]<minpath[0]:
minpath[0]=path[0]#当结束的时候path小于minpath,则将其替换。
return
#这里我先检索了向下,然后再向右。
if i+1<=n:
path[0]+=grid[i+1][j]
backtrack(i+1,j,grid,path,minpath,n,m)
path[0]-=grid[i+1][j]
if j+1<=m:
path[0]+=grid[i][j+1]
backtrack(i,j+1,grid,path,minpath,n,m)
path[0]-=grid[i][j+1]
def min_path(grid:list[list[int]]):->int
n=len(grid)-1
m=len(grid[0])-1
#这里path不能设置为0.因为起始格子也有对应的代价。
path=[grid[0][0]]
minpath=[100000]#一个足够大的数字即可。
backtrack(0,0,grid,path,minpath,n,m)
return minpath[0]
grid=[[1,3,1,5],
[2,2,4,2],
[5,3,2,1],
[4,3,5,2]]
min_path(grid)
最终输出结果为13.