1. 程式人生 > 其它 >【Leetcode每日筆記】64. 最小路徑和(Python)

【Leetcode每日筆記】64. 最小路徑和(Python)

技術標籤: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.length

n == 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]