【Leetcode每日筆記】64. 最小路徑和(Python)
阿新 • • 發佈:2021-01-13
技術標籤:LeetCode一週一結# 動態規劃動態規劃python演算法leetcode資料結構
文章目錄
題目
給定一個包含非負整數的 m x n 網格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。
說明:每次只能向下或者向右移動一步。
示例 1:
輸入:grid = [[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋:因為路徑 1→3→1→1→1 的總和最小。
示例 2:
輸入:grid = [[1,2,3],[4,5,6]] 輸出:12
提示:
m == grid.lengthn == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
解題思路
動態規劃
狀態定義
dp[i][j]表示達到當前位置(i,j)最小花費
狀態轉移方程
(i,j)只能從(i-1,j)或者(i,j-1)過來,所以可以得到狀態轉移方程為dp[i][j]=min(dp[i-1][j],dp[i][j-1])
初始化dp時,對第一行和第一列也進行初始化,防止遍歷時索引溢位。
程式碼
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int :
dp = grid.copy()
for i in range(1,len(grid)):
dp[i][0] += dp[i-1][0]
for j in range(1,len(grid[0])):
dp[0][j] += dp[0][j-1]
for i in range(1,len(grid)):
for j in range(1,len(grid[0])):
dp[i][j] += min(dp[i-1][j],dp[i][j- 1])
return dp[-1][-1]