给定m x n网格填充非负数,找到从左上角到右下角的路径,这样可以最小化路径上所有数字的总和。
例如:[1,3,1],[1,5,1],[4,2,1]]
根据上面的网格图,返回7
。因为路径1→3→1→1→1
最小化了总和。
我使用递归的解决方案,但这是错误的,请帮我纠正并解释我错过了什么。
import math
def minPath(grid,n,m,a,b):
if n>a or m>b:
return math.inf
grid[n][m] += min(minPath(grid,n+1,m,a,b),minPath(grid,n,m+1,a,b))
return grid[n][m]
def minPathSum(grid):
m = len(grid) - 1
n = len(grid[0]) - 1
a = m-1
b= n-1
minPath(grid,0,0,a,b)
return grid[a][b]
print(minPathSum([[1,3,1],[1,5,1],[4,2,1]]))
答案 0 :(得分:0)
为边框删除双减1,并更改if-condition
if n>b or m>a:
....
a = m //2 for 3x3 map
b = n
可能的主要问题:如果您的网格被全局修改,您将得到错误的解决方案(也许您的实现会在每次递归调用时生成本地副本)
答案 1 :(得分:0)
您忘记添加成功条件,即。如果递归解决方案接近最终网格,则返回网格值
if n==a and m==b:
return grid[n][m]
因此最终的解决方案应如下所示:
import math
def minPath(grid,n,m,a,b):
if n>a or m>b:
return math.inf
if n==a and m==b:
return grid[n][m]
return grid[n][m] + min(minPath(grid,n+1,m,a,b),minPath(grid,n,m+1,a,b))
def minPathSum(grid):
m = len(grid) - 1
n = len(grid[0]) - 1
a = m-1
b= n-1
minPath(grid,0,0,a,b)
return grid[a][b]
print(minPathSum([[1,3,1],[1,5,1],[4,2,1]]))