leetcode-最小路徑和
阿新 • • 發佈:2022-03-07
題目描述
給定一個包含非負整數的 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]