最小路径和的递归解决方案

时间:2018-04-07 19:52:32

标签: algorithm recursion data-structures dynamic-programming

给定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]]))

2 个答案:

答案 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]]))