1. 程式人生 > 其它 >leetcode-最小路徑和

leetcode-最小路徑和

題目描述

給定一個包含非負整數的 m x n 網格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

輸入輸出

思路分析

遇到統計可行路徑的數量問題,或者求最小路徑,一般有兩種方法,搜尋和動態規劃
注: 搜尋一般在資料規模比較小的時候使用。複雜度比較高,在本題中: \(2^{m+n}\)。故採用動態規劃

動態規劃

狀態定義:dp[i][j]:從左上角->(i,j)的最短路徑和
狀態轉移方程\(dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]\)
邊界情況:左邊界:i≠0,j=0, \(dp[i][j] = dp[i-1][j] + grid[i][j]\)


邊界情況:上邊界:i=0,j≠0, \(dp[i][j] = dp[i][j-1] + grid[i][j]\)
初始狀態:dp[0][0] = grid[0][0]

程式碼實現:

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        # if not grid or not grid[0]:
        #     return 0
        m,n = len(grid),len(grid[0])
        dp = [[0]*n for _ in range(m)]
        # 起始節點
        dp[0][0] = grid[0][0]

        # 動態規劃填表
        for i in range(m):
            for j in range(n):

                if i==j==0:
                    continue
                # 上邊界
                elif i==0:
                    dp[i][j] = dp[i][j-1]+grid[i][j]
                # 左邊界
                elif j==0:
                    dp[i][j] = dp[i-1][j]+grid[i][j]
                else:
                # 狀態轉移方程
                    dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]

        return dp[m-1][n-1]