今天是紀錄LeetCode解題的第六十四天
第六十四題題目:Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right, which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
給定一個m * n由非負整數組成的grid,找出一條路徑從左上到右下路徑總和值最小
注意:只能往右或往左移動
這題和62題也是同個概念(62、63、64都比較類似,可以往前看其他兩篇文章),我們可以用DP來解,只是現在DP表格裡的數字代表到該格的最少總和值,一樣我們先初始化row = 0、col = 0時的情況,可以知道到該格的最少路徑總和等於前一列(行)DP表格的值加目前格子的數值(dp[0][i] = dp[0][i-1] + grid[0][i]),在62題當中我們推論出轉移方程式為dp[r][c] = dp[r-1][c] + dp[r][c-1],而這裡則改成判斷這兩個誰最小再加上自己該格的數值,所以轉移方程式為dp[r][c] = min(dp[r-1][c] + grid[r][c],dp[r][c-1] + grid[r][c])
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n = len(grid[0])
dp = [[0] * n for _ in range(m)]
dp[0][0] = grid[0][0]
for i in range(1,m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for i in range(1,n):
dp[0][i] = dp[0][i-1] + grid[0][i]
for r in range(1,m):
for c in range(1,n):
dp[r][c] = min(dp[r-1][c] + grid[r][c],dp[r][c-1] + grid[r][c])
return dp[m-1][n-1]
| row\col | 0 | 1 | 2 |
|---|---|---|---|
| 0 | 1 | 4 | 5 |
| 1 | 2 | min(9,7) = 7 | min(6,8) = 6 |
| 2 | 6 | min(9,8) = 8 | min(7,9) = 7 |