用DP框架來思考 Minimum Path Sum 最小路徑成本總和_Leetcode #64

小松鼠
發佈於演算法專欄 個房間
閱讀時間約 8 分鐘

題目敘述 Minimum Path Sum

給定一個矩陣,每個格子點代表經過的對應成本。
每回合可以往右移動一格或往下移動一格。


請問從起點左上角 走到 終點右下角的最小路徑成本總和是多少?


測試範例

Example 1:

raw-image


Input: grid = [[1,3,1],[1,5,1],[4,2,1]]
Output: 7
Explanation: Because the path 13111 minimizes the sum.

最小成本的路徑: 1 -> 3 -> 1 -> 1 -> 1


Example 2:

raw-image


Input: grid = [[1,2,3],[4,5,6]]
Output: 12

最小成本的路徑: 1 -> 2 -> 3 -> 6

觀察 路徑的走法

題目已經說每回合可以往右移動一格,或 往下移動一格

起點在左上角,終點在右下角。

也就是說,假如我現在當下在(x, y),可以從左邊一格走過來,或上方一格走過來。


怎麼走可以成本最小?

示意圖

raw-image



如果定義DP[x, y] = DP[y][x] = 從起點走到(x, y)的最小成本

那麼

走到(x, y)的最小成本

= DP[x, y] = DP[y][x]

= (x, y)本身的成本 + 前一步的最小成本

= grid[x, y] + min{ 前一步的可能情況 }

= grid[x, y] + min{ 走到左邊一格的最小成本, 走到上方一格的最小成本}

= grid[x, y] + min{ DP[x-1, y], DP[x, y-1] } 比較直覺的表示法

= grid[y][x] + min{ DP[y][x-1], DP[y-1][x] } 傳統的陣列表示法


演算法 DP動態規劃

1.定義DP狀態

承接觀察點的思考,可以定義DP[x, y] = DP[y][x] = 從起點走到(x, y)的最小成本。

最終所求呢?

最後走到右下角的成本 = DP[ w-1, h-1] = DP[h-1][w-1] 就是最終答案


2.推導DP狀態轉移關係式

承接觀察點的思考與示意圖

走到(x, y)的最小成本

= DP[x, y] = DP[y][x]

= (x, y)本身的成本 + 前一步的最小成本

= grid[x, y] + min{ 前一步的可能情況 }

= grid[x, y] + min{ 走到左邊一格的最小成本, 走到上方一格的最小成本}

= grid[x, y] + min{ DP[x-1, y], DP[x, y-1] } 比較直覺的表示法

= grid[y][x] + min{ DP[y][x-1], DP[y-1][x] } 傳統的陣列表示法


3.釐清DP初始條件

最小規模的問題是什麼?

就是當地圖只剩下1x1的矩陣時,這時候起點=終點


最小路徑成本 = DP[0][0] = grid[0][0]


程式碼 DP動態規劃(Top-down)

class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:

# height and width of board
h, w = len(grid), len(grid[0])

## dictionary
# key: coordination
# value: minial cost from (0,0) to (x, y)
minCostTable = { (0,0) : grid[0][0] }

def dp(x, y):

# look-up table
if (x, y) in minCostTable:
return minCostTable[(x,y)]

# base case: top row
if x > 0 and y == 0:
minCostTable[(x,y)] = grid[y][x] + dp(x-1, y)

# base case: left-most column
elif y > 0 and x == 0:
minCostTable[(x,y)] = grid[y][x] + dp(x, y-1)

# general cases:
else:
minCostTable[(x,y)] = grid[y][x] + min( dp(x, y-1), dp(x-1, y) )

return minCostTable[(x,y)]

# =================================
return dp(w-1, h-1)

複雜度分析

時間複雜度: O(h*w)

總共有h*w格子點,每個格子點計算最小路徑成本總和一次。


空間複雜度: O(h*w)

DP table儲存每個格子點的最小路徑成本總和,總共有O(h*w)的格子點。


程式碼 DP動態規劃(Bottom-up)

class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:

h, w = len(grid), len(grid[0])

dp_table = grid

# Base case:
# optimization for row_#0
for x in range(1,w):
dp_table[0][x] = grid[0][x] + dp_table[0][x-1]

# optimization for column_#0
for y in range(1,h):
dp_table[y][0] = grid[y][0] + dp_table[y-1][0]


# General case optimization:
for y in range(1,h):
for x in range(1,w):
dp_table[y][x] = grid[y][x] + min( dp_table[y][x-1], dp_table[y-1][x] )

return dp_table[h-1][w-1]

複雜度分析

時間複雜度: O(h*w)

總共有h*w格子點,每個格子點計算最小路徑成本總和一次。


空間複雜度: O(1)

因為計算順序是從左到右,從上到下依序計算不回頭,這邊採用in-place更新
所以DP table不會耗費額外的空間。


關鍵知識點 從走法反推最小成本路徑的生成模式

題目已經說每回合可以往右移動一格,或 往下移動一格

起點在左上角,終點在右下角。

也就是說,假如我現在當下在(x, y),可以從左邊一格走過來,或上方一格走過來。


走到(x, y)的最小成本

= DP[x, y] = DP[y][x]

= (x, y)本身的成本 + 前一步的最小成本

= grid[x, y] + min{ 前一步的可能情況 }

= grid[x, y] + min{ 走到左邊一格的最小成本, 走到上方一格的最小成本}

= grid[y][x] + min{ DP[y][x-1], DP[y-1][x] } 傳統的陣列表示法


Reference

[1] Minimum Path Sum - LeetCode


回到DP特訓班目錄 和 學習路徑

52會員
340內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
用英文叫別人「別那麼急/別那麼激動」遛狗結果狗狗在路上暴走、孩子看到遊樂園等不及要衝了、朋友說話太嗨讓你快要跟不上。用三句英文讓對方或你的毛小孩「消消火」。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-12-12
用一個英文單字講人有多麼「跩」「唉呦很跩喔」、「很『秋』哦」,中文的跩和台語的秋,可以形容人很得意有自信又有點霸氣。就這麼剛好英文的own這個字可以傳達出這種fu。想知道怎麼使用嗎?這篇用超白話讓你秒懂。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-10-24
用 SEO 思維規劃以終為始的行銷策略:以 ChoozSEO 為例聊聊如何用 AI主題關鍵字工具來優化內容策略,並從中獲得更多洞見。
Thumbnail
avatar
Sho 的路上觀察手記
2023-10-18
用最簡單的日文問:「可以跟你合照嗎?」邀請日本人一起合照,卻不知道怎麼開口說出來嗎?看完這篇,馬上能現學現賣。
Thumbnail
avatar
你的英日語自學導師 譯難忘  ོꦿ༄꧁꧂
2023-10-05
用邏輯改變世界專訪(下)弱連結,真「有」用?你會察言觀色嗎?突破認知!|怪獸科技公司怪獸科技公司第二季,一起培養在快速變化社會的超強適應力!專案管理(PM)不僅涉及技術和流程的掌握,更重要的是人際溝通能力。過去曾擔任 PM 的 Davina 將帶我們深入解析 AI 時代下,她自己是養成溝通能力的一些好用方法,以及持續創新、突破認知邊界的意義。
Thumbnail
avatar
王政皓|怪獸科技公司
2023-08-30
用SPSS進行HLM第五章:步驟策略和解釋變異量測量本文章將介紹實務中進行HLM會需要注意的事項,包含樣本量要求、基本假設、計算解釋變異量和HLM建構策略。
Thumbnail
avatar
Dr. Rover
2023-08-15
劇評|《D.P:逃兵追緝令2》:走在「永恆回歸」的背後,依舊選擇戰鬥《D.P:逃兵追緝令2》雖然口碑不如第一季,但絕對不會不好看!與第一季劇情緊密相連的續作,依舊在想探討裡的主題中不停輪迴、深化、留白,留下餘韻十足的後續後,讓我們自行思考答案。雖然最後沒有給我像第一季曹石峰開槍自縊時的震撼,第二季曹石峰回歸的結尾,卻在溫暖中有了一絲「真的可以改變」甚麼的力量。
Thumbnail
avatar
夜半の故事備忘錄
2023-08-04
Netflix 原創韓劇《D.P:逃兵追緝令》,揭露韓國軍營霸凌問題的真實與震撼~D.P:逃兵追緝令 (共2季) | 評價 9/10 | awwrated https://awwrated.com/netflix/81280917 如果你對韓國的兵役制度有所了解,你可能會知道,那裡並不是一個充滿友愛和正義的地方。相反,那裡充斥著權力的濫用、暴力的威脅、心理的折磨和人性的扭曲。
Thumbnail
avatar
awwrated
2023-08-02
用SPSS進行HLM第四章:三層次之隨機截距斜率模型接續第三章內容,有時候多層次資料不只一個層次,可能具有多種層次,例如:學生屬於某個學校,而學校又屬於某個縣市。本章主要說明三層次之隨機截距模型的公式和SPSS操作,我們先從公式開始,然後在教學SPSS視窗和語法操作,相信看完後,讀者就會了解三層次之隨機截距斜率模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-07-26
用SPSS進行HLM第三章:雙層次之隨機截距斜率模型接續第二章內容,本章主要說明雙層次之隨機截距模型的公式和SPSS操作,我們先從公式開始,然後在教學SPSS視窗和語法操作,相信看完後,讀者就會了解雙層次之隨機截距斜率模型概念和操作。
Thumbnail
avatar
Dr. Rover
2023-07-13