題目
難度:★★★☆☆
類型:數(shù)學(xué)
方法:動(dòng)態(tài)規(guī)劃
給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格,請(qǐng)找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。
說明:每次只能向下或者向右移動(dòng)一步。
示例
輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 7
解釋: 因?yàn)槁窂?1→3→1→1→1 的總和最小。
解答
與上一道題類似,是典型的動(dòng)態(tài)規(guī)劃問題。
設(shè)置矩陣dp,該矩陣中每個(gè)位置的元素dp[i][j]表示到達(dá)位置(i,j)時(shí)的最小路徑和。
初始情況
i=0,第一行,此時(shí)dp[0][j]表示第一行位置j以前的所有元素之和;
j=0,第一列,此時(shí)dp[i][0]表示第一列位置i以前的所有元素之和;
狀態(tài)轉(zhuǎn)移方程
對(duì)于非第一行和第一列元素,存在狀態(tài)轉(zhuǎn)移方程:
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + dp[i, j]
最終情況
選取dp矩陣中右下角的元素作為結(jié)果返回即可。
class Solution:
def minPathSum(self, grid):
m, n = len(grid), len(grid[0])
# 處理第一行
for i in range(1, m):
grid[i][0] += grid[i-1][0]
# 處理第一列
for j in range(1, n):
grid[0][j] += grid[0][j-1]
# 處理中間的數(shù)
for i in range(1, m):
for j in range(1, n):
grid[i][j] += min(grid[i-1][j], grid[i][j-1])
# 返回最終結(jié)果
return grid[-1][-1]
if __name__ == "__main__":
s = Solution()
print(s.minPathSum([
[1, 3, 1, 2],
[1, 5, 1, 1],
[4, 2, 1, 1]
]))
如有疑問或建議,歡迎評(píng)論區(qū)留言~