1. 程式人生 > >Leetcode演算法——64、最小路徑之和(minimum path sum)

Leetcode演算法——64、最小路徑之和(minimum path sum)

給定一個 m*n 的非負整數矩陣,找到一條路徑,從左上角到右下角,要求這條路徑上的所有陣列之和最小。

備註:每次只能向下或向右移動。

Input:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

思路

本題與 不重複路徑I不重複路徑II 相似,都是從左上角向右或下走到右下角。

本題需要找到一條路徑,使得路徑上所有數字之和最小,同樣可以採用動態規劃方法。

因為只能向下或向右走,所以只可能通過 (i-1,j) 或 (i,j-1) 這兩個位置到達 (i,j)。

將從左上角(0,0)到座標(i,j)的路徑最小和記為 dp(i,j),則

dp(i,j) = min(dp(i-1,j), dp(i,j-1)) + grid[i][j]

有了遞推式,就可以從左上角開始依次計算整個 dp 矩陣的值。

python實現

def minPathSum(grid):
    """
    :type grid: List[List[int]]
    :rtype: int
    動態規劃。
    """
    if not grid:
        return 0
    m = len(grid)
    n = len(grid[
0]) dp = [[x for x in grid[i]] for i in range(m)] for i in range(m): for j in range(n): if i == 0 and j == 0: continue elif i == 0: dp[i][j] += dp[i][j-1] elif j == 0: dp[i][j] += dp[i-1][j] else
: dp[i][j] += min(dp[i][j-1], dp[i-1][j]) return dp[-1][-1] if '__main__' == __name__: grid = [ [1,3,1], [1,5,1], [4,2,1] ] print(minPathSum(grid))