DP動態規劃 深入淺出 以Fibonacci Number 費式數列 為例

閱讀時間約 4 分鐘
raw-image

Dynamic programming 對初學者似乎是很大的一道門檻。

教科書往往寫得太生硬,用幾行數學式子去代表背後的數學意義,對於剛開始接觸的同學會學得很吃力。

常常想破頭也想不出來,但是看到解答又好像看得懂,但不知道破題的關鍵到底從哪裡跑出來的。

別害怕,筆者也走過同樣的路。 XD

今天會帶領讀者從DP的大原則出發,從簡單的題目開始理解DP解題的精隨框架


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

需要複習的話,可以點這篇 究竟什麼是 動態規劃DP?


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

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

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

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


以一個大家耳熟能詳的費式數列拿當作第一道題目破題作為練習。

這篇專欄有一個專屬的解題教學影片,搭配服用,效果更佳。


題目敘述

詳細的原文題目可在這裡看到

題目要求我們求出費式數列的第n項,並且已經給定初始條件和遞迴關係式如下:

F(0) = 0, F(1) = 1
F(n) = F(n - 1) + F(n - 2), for n > 1.

雖然題目已經直接奉送DP所需要的遞迴關係式和初始條件,但這裡我們還是先走過一遍解題框架可分為三大步驟,藉此鞏固解題基礎。

(備註: 遞迴關係式初始條件往往是要自己推導出來的,特別是在Medium/Hard或者競賽題)


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

這題沒有什麼疑問,直接定義DP[n] = 費式數列的第n項即可。

比較習慣數學符號思考的讀者,可以想成令f(n) = 費式數列的第n項。


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


這裡題目也已經給了,不過就算沒給,我們也知道費式數列的通則就是

費式數列的第n項 = 費式數列的第n-1項 + 費式數列的第n-2項

寫成遞迴關係式就式DP[n] = DP[n-1] + DP[n-2]


比較習慣數學符號思考的讀者,可以想成令f(n) = f(n-1) + f(n-2)

留意,其實到了這一步,我們已經把大規模的問題DP[n]分解成兩個較小規模的子問題DP[n-1]、 DP[n-2]。


並且,我們知道,在得到子問題的答案之後,可以推導出原本所求

DP[n] = DP[n-1] + DP[n-2]


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


這裡題目已經指定,第零項F(0) = 0, 第一項F(1) = 1。

也就是說DP[0] = 0, DP[1] = 1

比較習慣數學符號思考的讀者,可以想成給定

f(0) = 0 且 f(1) = 1


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

這裡以Python作為示範


程式碼

class Solution:
 def fib(self, n: int) -> int:
  
  def dp(n):
   
   ## look-up table
   if n in table:
    return table[n]
   
   ## general cases
   # DP[n] = DP[n-1] + DP[n-2]

   table[n] = dp(n-1) + dp(n-2)
   
   return table[n]
  
  # ---------------------------------

  # base case
  # DP[0] = 0
  # DP[1] = 1
  table = {0:0, 1:1}
  
  return dp(n)

複雜度分析

時間複雜度: O( n )

總共有O(n)層呼叫,每層呼叫在O(1)時間內可以計算完。

空間複雜度: O( n )

遞迴深度最深為O( n ),DP table空間所需也為O( n )


下一篇: 一魚多吃 用費式數列的DP模型來解 爬樓梯Climbing Stairs_Leetcode #70


Refernce

[1] Python from Naive method to DP + optimization [w/ Comment]

82會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給定我們兩個字串,一個字串s,另一個字串t 要求我們判段字串s是否為字串t的子序列? (也就是s的每個字元都可以在t裡面找到,而且前後相對順序相同)
題目會給定我們一個二維矩陣,矩陣裡面的1代表一位士兵, 每個row裡面,row裡面士兵的總和就代表這條row的戰鬥力。 題目定義戰鬥力比較的規則: 士兵少的row戰鬥力比較小。 若有兩條row的戰鬥力相等, 則row index比較小的那條row,戰鬥力比較小。 請選出,前k個戰鬥力最弱的row
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
題目會給定我們兩個字串,一個字串s,另一個字串t 要求我們判段字串s是否為字串t的子序列? (也就是s的每個字元都可以在t裡面找到,而且前後相對順序相同)
題目會給定我們一個二維矩陣,矩陣裡面的1代表一位士兵, 每個row裡面,row裡面士兵的總和就代表這條row的戰鬥力。 題目定義戰鬥力比較的規則: 士兵少的row戰鬥力比較小。 若有兩條row的戰鬥力相等, 則row index比較小的那條row,戰鬥力比較小。 請選出,前k個戰鬥力最弱的row
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
你可能也想看
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.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.余生