各位大大安安,今天我們要來聊聊演算法界的隱藏王者:動態規劃(Dynamic Programming,簡稱 DP)。
很多人一聽到 DP 就直接投降,但其實 DP 就像打怪練等一樣,只要掌握核心精神,就會發現:它就是你早就在做的事,只是沒寫成表格罷了。
💥 什麼是動態規劃?
簡單來說:
「我現在要做的決策,能不能靠過去的最佳經驗來做選擇?」
再白話一點:
你打怪升級,不會每次都從 LV1 砍到 LV99,而是記住每次升級的過程,把經驗值存起來,下次不用重頭再來。
每一步都記起來,才不會白走
想像你玩 RPG:
- 初始血量 100
- 每條路徑上會遇到怪物、補包或陷阱
- 目標是走到終點血量還活著
這時候你會怎麼辦?
- 嘗試每一條路?
- 每次重走都重新計算?
不,你會記住:哪條路會損多少血、哪個角落有補包,然後把「過去最佳走法」存起來,這就是 DP!
🧠 DP 的兩大核心精神
- 重複子問題(subproblems):很多問題其實只是原問題的縮小版,學習 React 不用重學 JavaScript(因為你已經解過那個子問題)
- 最優子結構(optimal substructure):整體最優 = 局部最優的組合,理想的人生,也許不是一次完成,而是每階段的最好選擇累積出來的。
就像人生中應該盡可能早的談戀愛?早點失戀,就能夠更早成為更好的大人?
🧬 DP 是你的人生筆記
是不是在生活中也常這樣:
- 跟主管開會時踩雷,下次就記下來「不能直接說不」
- 約會時失言,就提醒自己「不要聊前任」
- 專案踩雷後產生 checklist,之後照著走就沒事
這些經驗筆記,其實都是生活版本的 DP 表格,這也就是傳說中的先做好一版,再做 CIP 的道理。
DP 的本質就是「不重走錯誤的路,持續更新更好的選擇」。
打怪如此,寫程式如此,人生何嘗不是?
📚 延伸閱讀
喜歡這篇文章,請幫忙拍拍手喔 🤣