DP動態規劃 深入淺出 以Unique Path 路徑總數 為例_精選75題

閱讀時間約 7 分鐘
raw-image

如同這個Dynamic programming 深入淺出系列的開始,在經過比較簡單的入門題(Coin Change)之後,來看比較進階的二維DP題目Unique Path

學而時習之不亦樂乎,再次強調DP的解題框架,鞏固知識點。

Dynamic programming本質是透過遞迴關係式,去解決一個大規模的問題,而這個大規模的問題又可以被分解為較小規模的子問題,而且子問題往往彼此重複

Dynamic programming的解題框架可分為三大步驟

1.定義狀態 [我在哪裡]

2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來]

3. 釐清初始狀態(也可以說是遞迴的終止條件) [第一步怎麼走,怎麼出發的]


題目敘述

詳細的題目可在這裡看到 Unique Paths


題目給定我們一個棋盤的高與寬,起點固定在左上角終點固定在右下角

每一步只能選擇往右走一格,或者往下走一格,不能回頭。

要求我們求出從起點到終點有幾條路徑


對應的解題影片,搭配服用,效果更佳。


測試範例

Example 1:

raw-image
Input: m = 3, n = 7
Output: 28

Example 2:

Input: m = 3, n = 2
Output: 3
Explanation: From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Down -> Down
2. Down -> Down -> Right
3. Down -> Right -> Down

老樣子,先走過一遍解題框架可分為三大步驟,藉此鞏固解題基礎。

1.定義DP狀態 [我在哪裡]

通常遇到這種棋盤式或者帶有點座標的題目,定義一個二維狀態的DP是一種很常見且直觀的選擇。

這裡,我們可以定義DP[x, y] 為從起點(0,0)到座標(x,y)的路徑數目(方法數)。

那麼,最後我們要計算的就是DP[終點x座標, 終點y座標] = DP[ n-1, m-1]


2.推導DP狀態轉移關係式(通則)
[我從哪裡來] => [答案從哪裡推導而來]

不難發現,除了最上面的那一條row,和最左的那一條column之外,

中間的點座標都有兩種選擇(往右或往下),反過來說,

中間的點座標可以從上面走過來,或者從左邊走過來。

raw-image

所以,推廣到一般化的通式,對點座標(x, y)而言

DP[ x, y]

= 從起點左上角(0, 0)到點座標(x, y)的方法數

= 從起點左上角(0, 0)到點座標(x-1, y)的方法數 + 從起點左上角(0, 0)到點座標(x, y-1)的方法數

= DP[x-1, y] + DP[x, y-1]


3. 釐清DP初始狀態(終止條件)
[第一步怎麼走,怎麼出發的]

有幾個情況是初始條件,或稱為遞迴的終止條件。

點座標為(0, 0)起點時,顯然,方法只有一種

DP(0, 0) = 1

另外,當點座標為最上方那條橫排時(x, 0),方法也只有一種(因為只能從左邊走過來,沒有別的方法)

DP[x, 0] = 1

同理,當點座標為最左邊那條直排時(0, y)方法也只有一種(因為只能從上面走下來,沒有別的方法)

DP[0, y] = 1


到這裡,已經填滿解題框架的所有內容,接著我們把它轉成程式碼,

這裡以Python作為示範


Top down DP程式碼

class Solution:
 def uniquePaths(self, m: int, n: int) -> int:
  
  # -----------------------------------
  
  # key: (m, n) size of grid
  # value: total path count from source to destinaion
  memo = {}
  
  def path_count(x, y):
   
   if (x, y) in memo:
    
    # look-up in memo
    return memo[(x, y)]
   
   if (x == 0) or (y == 0):
    
    # base case (starting point) and
    # special cases (top-most row as well as left-most column)
    memo[(m, n)] = 1
    return 1

   # general case
   memo[(x, y)] = path_count(x-1, y) + path_count(x, y-1)
   return memo[(x, y)]
 
  # -----------------------------------
  return path_count(x=n-1, y=m-1)

複雜度分析

時間複雜度: O( m * n )

O( m * n ),板子上的每個格子點都拜訪一次。

空間複雜度: O( m * n )

O( m * n ),板子上總共有O(m * n)個格子點,也是DP table的大小。


Bottom up DP程式碼

class Solution:
 def uniquePaths(self, m: int, n: int) -> int:
  
  rows, cols = m, n
  
  path_dp = [ [ 1 for j in range(cols)] for i in range(rows) ]
  
  
  # Dynamic Programming relation:
  
  # Base case:
  # DP(0, j) = 1 , only reachable from one step left
  # DP(i, 0) = 1 , only reachable from one step up
  
  # General case:
  # DP(i,j) = number of path reach to (i, j)
  #   = number of path reach to one step left + number of path reach to one step up
  #   = number of path reach to (i, j-1) + number of path to (i-1, j)
  #   = DP(i, j-1) + DP(i-1, j)
  
  
  
  for i in range(1, rows):
   for j in range(1, cols):
    
    path_dp[i][j] = path_dp[i][j-1] + path_dp[i-1][j]
  
  
  # Destination coordination = (rows-1, cols-1)
  return path_dp[rows-1][cols-1]

複雜度分析

時間複雜度: O( m * n )

O( m * n ),板子上的每個格子點都拜訪一次,對應到雙層迴圈內部的計算。

空間複雜度: O( m * n )

O( m * n ),板子上總共有O(m * n)個格子點,也是DP table的大小。


Reference

[1] Python/JS/Java/Go/C++by O( mn ) DP [ With explanation ]

80會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
今天再來看一題入門的2D DP題目: 巴斯卡三角形 再次複習Dynamic programming的解題框架,可分為三大步驟 1.定義狀態 [我在哪裡] 2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來] 3. 釐清初始狀態(也可以說是遞
這題乍看之下是新題目,但仔細一想, 其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。 題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。
題目會給我們一個輸入陣列candidates,和一個目標值 target 問我們,從canditdates裡面重複挑選,可以湊出總和為target目標值的組合數有幾種? 在此,我們將使用找零錢II的DP模型和化簡的技巧來解題。
在經過比較簡單的入門題(Coin Change)之後, 來看進階一點的DP題目Coin Change II 整零錢的全部方法數。 不免俗,再次強調DP的解題框架,鞏固知識點。
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
今天再來看一題入門的2D DP題目: 巴斯卡三角形 再次複習Dynamic programming的解題框架,可分為三大步驟 1.定義狀態 [我在哪裡] 2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來] 3. 釐清初始狀態(也可以說是遞
這題乍看之下是新題目,但仔細一想, 其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。 題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。
題目會給我們一個輸入陣列candidates,和一個目標值 target 問我們,從canditdates裡面重複挑選,可以湊出總和為target目標值的組合數有幾種? 在此,我們將使用找零錢II的DP模型和化簡的技巧來解題。
在經過比較簡單的入門題(Coin Change)之後, 來看進階一點的DP題目Coin Change II 整零錢的全部方法數。 不免俗,再次強調DP的解題框架,鞏固知識點。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
Christian Yu ,1990 年出生於澳洲的韓國人,單親家庭長大,十八歲首創作自己的 Youtube 視頻。他在大學時曾修讀科學和藝術,看來他沒有唸到畢業。在青少年時期被診斷出患有「雙相情感障礙」。退學後移居韓國發展, 他本來是「街頭藝術者」,由於舞技出色,被星探所發掘,在 2012
Thumbnail
這篇文章是給想要踏出創新舞台的你。 在你的創新之旅中,你可能面臨許多不確定的問題,或是缺乏具體的創新方向。這篇文章將為你提供一種新的視角。 我將分享我在創新旅程中,結合科學、工程與營運三大元素的洞見,這也是我在這場創新旅程中獲得的三個重要體悟。 體悟1 - 學習科學家的探索精神:科學家的工作就是減少
Thumbnail
📷 昨(17)日下午3點左右,在新北市樹林區光興街157巷4號,發生一起道路塌陷意外。根據區公所消息,區域內坍塌範圍長度約17米,高度約3米,面積約51平方公尺(約16坪),坍塌處下方住戶,無人受傷。現場交通維護人員進駐,引導車輛通行。區公所已安排收容安置3户8人至旅社。這起道路塌陷意外,連帶影響
近年房市推案量龐大,興建中工地不少,上個月幾宗建案因施工緣故導致周邊道路坍方,工程品質引發民眾疑慮。不過,根據現行法規,已購客並無法以此為理由要求取消合約。 📷 建案施工造成周邊道路塌陷,出現2個大坑洞。圖/新竹縣政府 🏡更多預售屋的都會傳說,都在全台16個在地社團~ 延伸閱讀:
Thumbnail
電影《洞》是一部以詩意描繪地穴探險者的一部冒險電影,故事改編真實的地底探險經過,描繪1961年義大利北方的年輕洞穴探險者,前往卡拉布里亞山區高原,探勘那當時最深的神秘洞穴,想要了解這神秘洞穴的盡頭究竟在哪裡?一步步地朝著更深處下潛而去。
Thumbnail
《CLOUDWAYS 是什麼?》 測速說明 參賽主機: linode ☞ RAM 1GB方案,機房位置為 Tokyo VULTR ☞ High frequency + RAM 1GB方案,機房位置為 Tokyo 測試內容: 後台操作速度☞區塊編輯器以及OXYGEN Builder 測試工具:
Thumbnail
DARKO的進階數據DPM,是2021年NBA業內認為最具參考價值的正負值進階數據。更是唯一一個,將球員生涯表現趨勢攤給你看的網站。(update: May 2022)
Thumbnail
那天在我家後院講完話後過幾天,童蘿打電話給我著急地問說哪裡可以去驗 Covid ? 原來他們公司出現了一個確診者,童蘿剛好在茶水間裡跟他打過照面,她又急又慌不知道怎麼辦才好。 童蘿聽完安慰老大,應該是他們的父親想讓三個孩子們能夠更熟悉,所以才安排在一起,孩子多也比較熱鬧好玩不是嗎?
Thumbnail
1.你其实不是怕高,你只是怕坠落。 2.能打动人的从来不是花言巧语,而是恰到好处的温柔以及真挚的内心。 3.白天神经病,晚上抑郁症,这样活着真累,也不知道能撑多久。 4.没有人会喜欢孤独、只是比起忽冷忽热;孤独让人感到踏实。 5.听到一些事,明明不相干的,也会在心中拐好几个弯想到你。 6.余生
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
Christian Yu ,1990 年出生於澳洲的韓國人,單親家庭長大,十八歲首創作自己的 Youtube 視頻。他在大學時曾修讀科學和藝術,看來他沒有唸到畢業。在青少年時期被診斷出患有「雙相情感障礙」。退學後移居韓國發展, 他本來是「街頭藝術者」,由於舞技出色,被星探所發掘,在 2012
Thumbnail
這篇文章是給想要踏出創新舞台的你。 在你的創新之旅中,你可能面臨許多不確定的問題,或是缺乏具體的創新方向。這篇文章將為你提供一種新的視角。 我將分享我在創新旅程中,結合科學、工程與營運三大元素的洞見,這也是我在這場創新旅程中獲得的三個重要體悟。 體悟1 - 學習科學家的探索精神:科學家的工作就是減少
Thumbnail
📷 昨(17)日下午3點左右,在新北市樹林區光興街157巷4號,發生一起道路塌陷意外。根據區公所消息,區域內坍塌範圍長度約17米,高度約3米,面積約51平方公尺(約16坪),坍塌處下方住戶,無人受傷。現場交通維護人員進駐,引導車輛通行。區公所已安排收容安置3户8人至旅社。這起道路塌陷意外,連帶影響
近年房市推案量龐大,興建中工地不少,上個月幾宗建案因施工緣故導致周邊道路坍方,工程品質引發民眾疑慮。不過,根據現行法規,已購客並無法以此為理由要求取消合約。 📷 建案施工造成周邊道路塌陷,出現2個大坑洞。圖/新竹縣政府 🏡更多預售屋的都會傳說,都在全台16個在地社團~ 延伸閱讀:
Thumbnail
電影《洞》是一部以詩意描繪地穴探險者的一部冒險電影,故事改編真實的地底探險經過,描繪1961年義大利北方的年輕洞穴探險者,前往卡拉布里亞山區高原,探勘那當時最深的神秘洞穴,想要了解這神秘洞穴的盡頭究竟在哪裡?一步步地朝著更深處下潛而去。
Thumbnail
《CLOUDWAYS 是什麼?》 測速說明 參賽主機: linode ☞ RAM 1GB方案,機房位置為 Tokyo VULTR ☞ High frequency + RAM 1GB方案,機房位置為 Tokyo 測試內容: 後台操作速度☞區塊編輯器以及OXYGEN Builder 測試工具:
Thumbnail
DARKO的進階數據DPM,是2021年NBA業內認為最具參考價值的正負值進階數據。更是唯一一個,將球員生涯表現趨勢攤給你看的網站。(update: May 2022)
Thumbnail
那天在我家後院講完話後過幾天,童蘿打電話給我著急地問說哪裡可以去驗 Covid ? 原來他們公司出現了一個確診者,童蘿剛好在茶水間裡跟他打過照面,她又急又慌不知道怎麼辦才好。 童蘿聽完安慰老大,應該是他們的父親想讓三個孩子們能夠更熟悉,所以才安排在一起,孩子多也比較熱鬧好玩不是嗎?
Thumbnail
1.你其实不是怕高,你只是怕坠落。 2.能打动人的从来不是花言巧语,而是恰到好处的温柔以及真挚的内心。 3.白天神经病,晚上抑郁症,这样活着真累,也不知道能撑多久。 4.没有人会喜欢孤独、只是比起忽冷忽热;孤独让人感到踏实。 5.听到一些事,明明不相干的,也会在心中拐好几个弯想到你。 6.余生