获取最小总和路径动态规划方法索引的最佳方法?
Best way to get the indexes of a minimum sum path dynamic programming approach?
上下文: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))
但是,这种方法只returnslowest/largest求和路径。是否有一种简洁的方法也可以获取构成最佳路径的数字的实际索引?
将当前路径保留为元组的第二个元素。请注意,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)))
上下文: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))
但是,这种方法只returnslowest/largest求和路径。是否有一种简洁的方法也可以获取构成最佳路径的数字的实际索引?
将当前路径保留为元组的第二个元素。请注意,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)))