Leetcode演算法——64、最小路徑之和(minimum path sum)
阿新 • • 發佈:2018-12-25
給定一個 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))