【问题标题】:Best way to get the indexes of a minimum sum path dynamic programming approach?获取最小和路径动态规划方法的索引的最佳方法?
【发布时间】:2021-04-01 15:16:42
【问题描述】:

上下文:https://leetcode.com/problems/minimum-path-sum/

这个问题的动态规划解决方案如下所示:

from math import inf

def min_path(grid, y, x):

    matrix = [[0] * (y + 1) for _ in range(x + 1)]
    matrix[0][0] = grid[0][0]

    for i, row in enumerate(matrix):
        for j, n in enumerate(row):
            if i == 0 and j == 0: 
               continue
            matrix[i][j] = grid[i][j] + min(i and matrix[i-1][j] or inf, j and matrix[i][j-1] or inf) 

    return matrix[x][y]

print(min_path([[1, 2, 3], 
                [4, 8, 2], 
                [1, 5, 3]], 2, 2))

但是,这种方法只返回最小/最大和路径。有没有一种简洁的方法来获得构成最佳路径的数字的实际索引?

【问题讨论】:

  • post 中的代码不起作用(至少因为第 10 行的语法错误 - 加号 - 并且未定义 inf)。此外,像这里这样创建矩阵会导致您意想不到的结果。 [0]*(x+1) 返回列表,如果其中任何一个元素发生更改,所有元素都将同步更改,因为它们引用相同的内存。但是如果你能解决这个问题,获取路径和值很简单:只需保留网格元组(长度、完整路径作为元组或列表)而不是单个值。如果需要,您还可以创建第二个矩阵来存储路径。
  • 好吧,我会在 30 分钟后查看,如果没有人会更快,我会尝试发布代码

标签: python algorithm dynamic-programming


【解决方案1】:

将当前路径保留为元组的第二个元素。请注意,min() 的比较将由第一个元素执行,因此不应指定其他键。同样对于当前问题,我们可以省略tuple(tuple()),因为由于使用了算法,我们永远不会得到这个元素。我创建了一个按元素添加元组的函数,您也可以使用 numpy 数组代替或创建 lambda 函数并传递它而不是 (lambda x,y: tuple(x[i]+y[i] for i in range(len(x))))(...) 之类的名称。

from math import inf

def elwise(x,y):
    return tuple(x[i]+y[i] for i in range(len(x)))

def min_path(grid, y, x):
    matrix = [[(0, ((i,j),)) 
        for j in range(y + 1)] 
        for i in range(x + 1)]
    matrix[0][0] = (grid[0][0], ((0,0),))

    for i, row in enumerate(matrix):
        for j, n in enumerate(row):
            if i == j == 0: 
               continue
            matrix[i][j] = elwise(
                min(
                    i and matrix[i-1][j] or (inf,tuple(tuple())), 
                    j and matrix[i][j-1] or (inf,tuple(tuple()))), 
                (grid[i][j],((i,j),)))

    return matrix[x][y]

print(min_path([[1, 2, 3], 
                [4, 8, 2], 
                [1, 5, 3]], 2, 2))

此代码打印以下内容:

(11, ((0, 0), (0, 1), (0, 2), (1, 2), (2, 2)))

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多