究竟什麼是 動態規劃DP?

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


動態規劃Dynamic Programming其實是
一種泛用的演算法思考方式演算法建構框架

動態規劃並不拘束於只能解課本上特定的的範例題。


只要我們能找出DP狀態定義、DP遞迴結構、初始條件(終止條件),就能適用動態規劃來解題,以數學的形式表達,並且在紙筆上或者電腦上、計算機上計算得到答案


最直接白話的解釋

白話的說,其實DP動態規劃就是一種問題化簡的技巧
幫助我們把大規模的題目化簡到小規模的題目解開小題目的解,把小題目的解儲存起來避免重複計算,並且由小規模的題目反推大規模題目的答案,最終得到原本大規模題目的解


就好像一句成語說的:「大事化小,小事化無。」
大問題化簡到小問題 就好比 大事化小
小問題透過查表或者初始條件得到答案,就相當於 小事化無


(犧牲)空間換取時間(進步)的策略

敏銳的讀者可能已經發現,DP的外表其實和DFS形式實現的遞迴function很像。

但是具體差別在哪裡呢?

DP同樣也有遞迴定義,但是多了隨身記事本
(課本會把隨身記事本稱之為DP table, 或 memoization記憶化的搜索)


DP = Recursion definition 遞迴定義 + Table 紀錄答案的表格

相當於 DFS + memoization


DP動態規劃演算法在遞迴的過程中,
會把每一次當下計算到的答案連同傳入參數一起存起來
這樣當之後遇到重複的函式呼叫時,就會直接查表返回答案
避免冗餘不必要的重複計算


這邊想一下,假如暴力搜索展開費式數列。
例如計算F(100),是不是比較小的那幾項都要重複計算好幾遍?




在思考建構DP演算法時,通常有一個基本框架可以遵循:


DP演算法建構框架

  1. 定義DP狀態。
    DP[i]代表原題目什麼情況下的解

  2. 推導DP狀態轉移關係式(也可稱為DP遞迴關係式)。
    DP[i]如何遞迴化簡到更小規模的問題DP[j]

  3. 釐清DP狀態的初始條件(或終止條件)。
    DP[ 初始條件 ] =?
    通常是最小規模的幾個問題 或者是 問題的最後邊界,而且可以紙筆計算或者人為推理出答案


如果上述三個條件都具備了,就代表DP演算法的數學形式已經確立。

接下來只要把演算法轉成對應的程式碼,就可以透過電腦進行驗證和計算答案。



實際案例與對照

如果用大家熟知的費式數列來說

通常,老師或教科書會給出如下的定義

F(n) = F(n-1) + F(n-2) , n >= 2

F(0) = 0

F(1) = 1


那麼對應到DP動態規劃的觀點,怎麼看呢?


DP狀態定義 DP[n] 就相當於F(n),費式數列的第n項。


DP狀態轉移關係式 相當於 DP[n] = DP[n-1] + DP[n-2]

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


DP狀態的初始條件就相當於最小規模的幾個問題 或者是 問題的最後邊界

DP[0] = 0

DP[1] = 1

定義費式數列的第零項 = 0

定義費式數列的第一項 = 1


求DP[n]也就是費式數列的第n項,
即便n很大,我們還是可以透過遞迴化簡到已知項,
最後再從已知項反推計算得到DP[n] 也就是費式數列的第n項。


這篇的目標是先讓讀者對於DP有初步的了解與認識,下一篇文章會開始用費式數列來作為整個DP特訓班系列的開頭,解說DP演算法框架的思考流程和步驟。


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

求解費式數列第n項的DP程式碼

class Solution:
def fib(self, n: int) -> int:

# DP table with F(0) = 0, F(1) = 1
dp = {0: 0, 1: 1}

def getFib( i ):

if i in dp:
return dp[i]

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


Reference

[1] Wiki: 動態規劃

[2] Introduction to Algorithm, CLRS

52會員
339內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
通通叫做電動車? EV、BEV、HEV、PHEV、EREV 傻傻分不清?究竟是什麼又有哪些差別?全球各大車廠都在研發 EV 電動車,媒體也時常討論電動車的未來,什麼 EV 電動車、BEV 純電動車、 HEV 油電混合、PHEV 插電式混合動力車…等名詞常常把人搞得一頭霧水,明明都是電動車究竟差別在哪裏? 以下簡單說明解釋這些名詞,讓你能快速了解它們之間的差異。 EV 電動車 EV 電動車
Thumbnail
avatar
Gama
2024-04-01
很多動物名稱都是「豸」部,「豸」究竟是什麼動物?「豸」是不少動物名稱都會使用的部首,「豸」的古文字是畫出一種動物的側面,但這種動物的特徵不明顯⋯⋯
Thumbnail
avatar
稽古齋
2024-02-05
在當今社會,眾所皆言「投資自己」,但究竟什麼才是真正的自我投資呢?我知道巴菲特說過『通膨下最好的投資就是投資自己』,我知道很多人都強調要『愛自己』,我也知道『年輕人要好好的投資自己的時間』,但到底做哪些事才是投資自己呢?
Thumbnail
avatar
Yunnie
2023-11-01
領養能夠帶動野生保育?野保動保兩者其實不衝突?一般人也可以做到的台灣野生保育方式究竟是什麼?節目這邊聽 📎錄製時間: 2023.08 2022年的新聞顯示,台灣動物多樣性48年間居然已經減少了八成! 動物界的保育拉響警報了! 我們普通老百姓究竟該怎麼做? 而貓貓狗狗又到底該不該在外面流浪呢? 現在就跟著小編還有我們的當家花旦-江小姐,一起跟挺挺動物應援團創辦人劉偉蘋老師探討,看
Thumbnail
avatar
小編在那邊
2023-10-15
究竟為什麼大家都說Fender Tour是最懂你心的藍牙耳機呢?@海國樂器, Fender, 藍牙耳機 隨著世代的變遷、科技的進步,傳統有線耳機已漸漸地被藍芽無線耳機給取代,不用再擔心被惱人的耳機線給纏繞,而市面上琳瑯滿目的無線耳機品牌百百款,到底該選哪ㄧ款呢?這裡真心推薦你美國經典音樂設備品牌 Fender推出的 Fender Tour 真無線入耳監聽耳機!
avatar
海國樂器
2023-09-10
UBI – 全民基本收入究竟是什麼?丨一文讀懂系列(九)接著當我們深入往下探究就會發現,原來 UBI 更不是近期才出現的新創舉,而是可以連結到 16 世紀就被文藝復興代表人物湯馬斯摩爾出版的文學著作所提及的一種理想,也就是我們所熟知的 “烏托邦”,時間推移至 20 世紀 60 年代末,著名的民權運動領袖馬丁·路德·金恩 (Martin Luther Ki
Thumbnail
avatar
ZZW
2023-06-23
【動保雜談Part.1】兔兔那麼可愛!怎麼可以吃兔兔?!究竟什麼是動保?「兔兔那麼可愛!怎麼可以吃兔兔??」 出自《撒嬌女人最好命》中隋棠的經典台詞 所以,我們是因為可愛,才在意某些動物的權利嗎?
Thumbnail
avatar
Lucia_Ph
2023-06-02
當紅包禮金有了價目表,究竟是什麼定義關係的價值?當紅包禮金有了價目表,究竟是什麼定義我們關係彼此的價值呢? 『 真正的禮物是不會有等級關係的。』新人芳芳說著。 語畢,新人發了鈔票圖案的便條紙,請受邀者用筆寫下對於婚禮與交換的事宜,或者是對新人的祝福。將這些寫滿文字祝福的話語,放入紅包袋贈與新人。
Thumbnail
avatar
Peiwen K
2022-03-13
紅透半片天的 NFT 究竟是什麼東西?兼回答觀眾來信問題 這篇是要來跟大家分享NFT,這個嶄新的玩意兒,是需要滿多鋪成的知識的。像是區塊鏈、數位貨幣等等。我在EP26 有講過一些區塊鏈的淺談,有興趣的話也可以來聽聽: https://apple.co/3ImYotN 好拉,今天這篇文章不是來直接解釋NFT的。 史塔克實驗室官網:
Thumbnail
avatar
史塔克實驗室
2022-01-22
#小小看動漫 #動畫《#強風吹拂》──跑步,究竟是為了什麼而跑?簡介: 有著跑步才能的藏原走,走投無路住進「青竹」之後,寬政大學競走部終於湊滿十人!在清瀨灰二的勸誘之下,全員開始了跑進箱根驛傳的旅程!  繼《灌籃高手》《網球王子》《黑子的籃球》,以及《Free!》《排球少年!!》後又一部運動類動漫!!
Thumbnail
avatar
小小文字人
2020-11-16