簡體   English   中英

獲取最小和路徑動態規划方法的索引的最佳方法?

[英]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))

但是,這種方法只返回最小/最大和路徑。 是否有一種簡潔的方法來獲得構成最佳路徑的實際數字索引?

將當前路徑保留為元組的第二個元素。 請注意, min()的比較將由第一個元素執行,因此不應指定其他鍵。 同樣對於當前問題,我們可以省略tuple(tuple()) ,因為由於使用了算法,我們永遠不會得到這個元素作為結果。 I created a function to add tuples elementwise, you can also use numpy arrays instead or create lambda function and pass it instead of name like (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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM