DP演算法框架 與 推薦的DP學習路徑 (持續更新中)

更新於 發佈於 閱讀時間約 16 分鐘

起源: 究竟什麼是DP動態規劃?


費式數列類
(雖然簡單,但是要了解為何引入DP,DP的優點在哪)


DP狀態轉移關係式

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


詮釋

第n項 = 前兩項相加 = 第n-1項 + 第n-2項。

到第n階的方法 = 先到第n-1階 再踩一階,或者 先到第n-2階 再踩兩階。(在一次只能踩一階或兩階的前提下)

長度為n的序列解碼方法數
= 長度為n-1的序列解碼方法數 + 長度為n-2的序列解碼方法數 (在解碼1A~26Z的前提下)

raw-image


遞迴數列 配合 數列DP框架

合縱連橫: 從 數列DP 理解 遞迴數列的本質


Fibonacci Number

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


Climbing Stairs

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


N-th Tribonacci Number

活用DP: 泰伯納西數列的第n項 Leetcode #1137_精選75題


Min Cost Climbing Stairs

一魚多吃 用費式數列的模型來解 Min Cost Climbing Stairs_Leetcode #746_精選75題


Decode Ways

一魚多吃 用DP計算解碼的方法數 Decode Ways_Leetcode #91


取捨類(取/不取,做/不做...)


DP狀態轉移關係式 與 詮釋

DP[ i ]

= 包含物件i的子集合 和 不包含物件i的子集合

= DP[i-1] + nums[i] 和 DP[i-1]


Subsets

一魚多吃 多角度切入 Subset 子集合生成 Leetcode #78



DP狀態轉移關係式 與 詮釋

DP[ i ]

= Max{ 解開現在第i道題目, 跳過第i道題目 }

= Max{ questions[i][0] + DP[ i + questions[i][1] + 1 ], DP[ i+1 ] }


Solving Questions With Brainpower

用取捨DP來考高分 Solving Questions With Brainpower_Leetcode #2140


DP狀態轉移關係式 與 詮釋

DP[區間] = Max{ 拿i項物品的利益 - DP[對手的區間] }

= Max{ 拿1樣的局面獲得的利益, 拿2樣的局面獲得的利益, 拿i樣的局面獲得的利益, ...}


Stone Game

玩遊戲也可以用DP ? 石頭遊戲 Stone Game I 的最佳策略_Leetcode #877


Stone Game II

玩遊戲也能用DP? 石頭遊戲Stone Game II 的最佳策略+影片教學_Leetcode #1140


Stone Game III

用DP來玩遊戲 石頭遊戲 III_Stone Game III_Leetcode #1406



找零錢類(多重選擇,擇優選)

DP狀態轉移關係式 與 詮釋


DP[ amount ]

= 用題目給定的零錢coins去找零錢,看哪一種的找零錢方法所需要的銅板數量最少

= min{ DP[ amount - coin_i ] }, where coin_i is a valid coin


合縱連橫: 找零錢的DP框架_理解背後的本質

合縱連橫: 找零錢的DP框架_理解背後的本質


Coin Change

DP動態規劃 深入淺出 以Coin change最精簡找零 為例


Perfect Squares

一題多解 用DP、BFS去解 Pefect Square 完全平方數的化簡_Leetcode #279



DP[ amount, coin_index ]

= 用題目給定的零錢coins去找零錢,計算總共有多少種找零錢的組合方法數。

= DP[ amount, coin_index-1 ] + DP[ amount - coins[coin_index], coin_index],

where coin_index is index of a valid coin


Coin Change II

DP動態規劃 深入淺出 以Coin change II 找零方法數 為例


Combination Sum IV

化簡無所不在 用找零錢DP框架來解 組合數之和IV_Combinations Sum IV_Leetcode #377



打家劫舍類(相鄰的物件不可同時選擇)


DP狀態轉移關係式

DP[i] = Max{ DP[i-2] + value[i], DP[i-1] + 0 }


詮釋

當下的最佳利益
= Max{ 選第i個物件情境下所能獲得的總體利益, 跳過不選第i個物件 情境下所能獲得的總體利益}

raw-image

raw-image


House Robber 系列題統整

合縱連橫: 從區間DP理解House Robbery系列題 背後的本質


House Robber

一魚多吃 用DP解House Robbery 打家劫舍問題_Leetcode #198_Leetcode 精選75題解析


Delete and Earn

化簡無所不在 用學過的DP模型解Delete and Earn 取捨之下的最高分數_Leetcode #740


House Robber II

化簡無所不在 用學過的DP模型解House Robbery II


House Robber III

舉一反三 用樹型DP思想來解 House Robbery III_Leetcode #337



房屋著色類(相鄰的房屋不可著同樣顏色)


DP狀態轉移關係式 與 詮釋

DP[i, prevColor]代表第i棟房屋~最後一棟房屋的最小著色成本

= min{ 第i棟房屋房屋選一個不和前一棟重複的顏色著色,接著考慮下一棟 }

= min{ costs[i][color] + DP[i+1, color] where color != prevColor }


Paint House

用取捨DP框架來上色 粉刷房屋I_Paint House_Leetcode #256


遞增/遞減子序列、遞增/遞減數列類

(符合特定規則的子序列、數列)


DP狀態轉移關係式

DP[ i ] = max( DP[i], DP[ k ] + 1 ), where k < i and nums[k] < nums[i]


詮釋

當下index i 的最長遞增子序列

= Max{ 原本的子序列長度,從前面比較小的數字nums[k]延伸過來的長度 }


Longest Increasing Subsequence

步步高升 最長遞增子序列 Longest Increasing Subsequence_DP_Leetcode #300


Number of Longest Increasing Subsequence

化簡無所不在 用學過的DP模型解Num of Longest Increasing Subsequence_LC#673



DP狀態轉移關係式

DP[ cur ][ diff ] = DP[ before ][ diff ] + 1,
where diff = nums[cur] - nums[before]


詮釋

後項-前項伴隨著公差diff,等差數列再延伸,長度+1


Longest Arithmetic Subsequence

用DP框架來思考 最長的等差數列Longest Arithmetic Subsequence_Leetcode#1027



DP狀態轉移關係式

DP[ cur ] = DP[ cur - diff ] + 1,

where diff = 給定的公差


詮釋

後項-前項伴隨著公差diff,等差數列再延伸,長度+1

Longest Arithmetic Subsequence of Given Difference

化簡無所不在 用數列DP來解 給定公差的最長等差數列 Leetcode #1218


路徑探索 (格子點DP)類

(在方格棋盤/格子點之中尋找路徑)


DP狀態轉移關係式 (在每回合只能往右走一格,往下走一格的前提下)

DP[y][x] = DP[y][x-1] + DP[y-1][x] 古典陣列式的寫法

DP[x, y] = DP[x-1, y] + DP[x, y-1] 比較直覺的pair+字典寫法


詮釋

(x, y)當下這個格子點,可以從上面(x, y-1)走過來,可以從左邊(x-1, y)走過來。

raw-image


移動路徑 配合 格子點DP框架

合縱連橫: 從 移動路徑 理解 格子點DP 框架的本質。


Unique Paths

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


Unique Paths II

DP動態規劃 深入淺出 以Unique Path II 路徑總數II 為例


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] } 傳統的陣列表示法


Minimum Path Sum

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



DP狀態轉移關係式 與 詮釋(只能下墜到左下方、正下方、右下方的前提下)

DP[y][x] = 從最上方下墜到matrix[y][x]的最小路徑成本

=[y][x]本身這格的成本 + min{ 從上方那一排下墜的成本 }

= matrix[y][x] + min{ DP[y-1][x-1], DP[y-1][x], DP[y-1][x+1]}


raw-image


Minimum Falling Path Sum

一魚多吃 用DP解最小成本的下墜路徑和 Minimum Falling Path Sum_Leetcode #931




DP狀態轉移關係式 (巴斯卡三角形的生成)

C(n, k) = C(n-1, k-1) + C(n-1, k) 組合數學的基本定理

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

詮釋

n個物品選k個 = 第n號物品有選中,剩下的選k-1個 + 第n號物品沒選中,剩下的選k個


raw-image



Pascal's Triangle

DP動態規劃 深入淺出 以Pascal Triangle 巴斯卡三角形 為例_Leetcode #118


Pascal's Triangle II

DP動態規劃 深入淺出 以Pascal's Triangle II 巴斯卡三角形 II為例



交易模擬(股票買賣、最小成本、最大獲利...) 類


限制只做多,在數個交易日中買賣獲得最大價差利潤


DP狀態轉移關係式

DP[ 今日持有現金 ] = Max{ DP[昨日持有現金], DP[昨日持有股票]+今日股價}

DP[ 今日持有股票 ] = Max{ DP[昨日持有股票], DP[昨日持有現金]-今日股價 }


詮釋

今天持有現金: 要嘛昨天就已經持有現金,要嘛今天才賣股票

今天持有股票: 要嘛昨天就已經持有股票,要嘛今天才買股票


raw-image


Best time to buy and sell stock 全系列題

合縱連橫: 從DP框架理解 最佳股票買賣系列題 的背後本質


Minimum Cost to Cut a Stick

用DP來精打細算 切割木條的最小成本 Min Cost to Cut a Stick_Leetcode #1547



給定旅行日期,和火車套票票價,計算最小旅行支出非用


DP狀態轉移關係式 與詮釋

假如我們今天要出遊有那些選擇?

其實就是三種選擇,

第一種是買一日票,只能覆蓋今天
第二種是買七日票,可以覆蓋最靠近的連續七天
第三種是買30日票(月票),可以覆蓋最靠近的連續三十天


我們要做的就是從這三種選擇裡面,

挑一個能夠盡量覆蓋出遊日期,又兼顧支出費用最小的選擇

DP[ day ]
= min( 一日票 + DP[ day-1], 七日票 + DP[day-7], 30日票 + DP[ day-30] )


Minimum Cost For Tickets

用DP來精打細算 火車旅行支出的最小費用_Leetcode #983 最佳化DP應用



共同子序列類 (Longest Common Subsequence)


DP狀態轉移關係式 與詮釋

LCS(Sa, Ta) = LCS(S, T) + 1 字尾相同,可以向前延伸

LCS(Sa, Tb) = Max{ LCS(Sa, T), LCS(S, Tb) } 字尾相異,只能捨棄當下字尾


Longest Common Subsequence

DP經典應用: 找出 最長共同子序列的長度 LCS_Leetcode #1143_Leetcode 精選75題解析


Uncrossed Lines 就是數字版本的LCS

化簡無所不在 用LCS的DP模型解Uncrossed Lines_Leetcode #1035


Longest Palindromic Subsequence 其實就是字串s和字串s頭尾顛倒的LCS

化簡無所不在 用LCS的DP模型解 最長回文子序列 Longest Palindromic Subseq_LC#516



圖論 最短路徑類 (或 最小成本路徑) Shortest Path


DP狀態轉移關係式 與詮釋

假如我們今要從節點i 走到節點j,怎麼走是最短路徑(或者 最小成本路徑)?

DP[i, j]
= min( DP[i, j], DP[i][k] + DP[k][j] )

如果原本 節點i 走到節點j 的路徑比較短,就維持原狀

如果 節點i 先走到 節點k 再走到節點j 的路徑比較短,就選擇這條更短的路徑。​


Minimum Cost to Convert String I 轉換字串的最小成本

圖論+DP: 字串轉換的最小成本 Min Cost to Convert String I_Leetcode #2976


Path with Maximum Probability 成功機率最高的路徑

🚗圖論+DP應用:最高成功機率的路徑 Path with Max Probability_Leetcode #1514

留言
avatar-img
留言分享你的想法!
沐沐-avatar-img
2024/06/06
六月六日祝您~~~~
😘😘😘
小松鼠-avatar-img
發文者
2024/06/06
林燃(創作小說家) 太客氣喇 姐姐這個叫做"筆耕"🥦☘🌱🌲🍓🍅🌶托您的福,最近又多幾位新訂閱的學員,好開心!
小松鼠-avatar-img
發文者
2024/08/18
DP應用: Ugly Number II _Leetcode #264提及了這篇文章,趕快過去看看吧!
avatar-img
小松鼠的演算法樂園
95會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/08/27
Path with Maximum Probability 題目給定一個無向圖(雙向移動皆可), 提供每條邊的起終點,和每條邊對應的通過時的成功機率。 請問從起點start走到終點end的最高成功機率是多少? 如果完全沒有路徑可以抵達,則返回0。
Thumbnail
2024/08/27
Path with Maximum Probability 題目給定一個無向圖(雙向移動皆可), 提供每條邊的起終點,和每條邊對應的通過時的成功機率。 請問從起點start走到終點end的最高成功機率是多少? 如果完全沒有路徑可以抵達,則返回0。
Thumbnail
2024/08/21
題目敘述 664. Strange Printer 有一台奇怪的印表機, 每次操作只能連續印同樣的字母,但是列印的長度可以自由控制。 而且,印刷的時候,可以蓋過去舊的字元。 (這邊當然不合常理,讀者可以理解成塗了立可帶再蓋過去的情境) 給定一個輸入字串s,請問最少需要幾次操作,才能印出字串s?
Thumbnail
2024/08/21
題目敘述 664. Strange Printer 有一台奇怪的印表機, 每次操作只能連續印同樣的字母,但是列印的長度可以自由控制。 而且,印刷的時候,可以蓋過去舊的字元。 (這邊當然不合常理,讀者可以理解成塗了立可帶再蓋過去的情境) 給定一個輸入字串s,請問最少需要幾次操作,才能印出字串s?
Thumbnail
2024/08/20
題目敘述 1406. Stone Game III Alice 和 Bob 輪流玩取石頭的遊戲。 輸入陣列stoneValue 代表每顆石頭對應的價值。 規則如下: 每個人每回合可以從剩餘的石頭,從前面拿一顆、兩顆、或三顆石頭。 兩個人輪流交替拿。Alice先手,第一回合Alice
Thumbnail
2024/08/20
題目敘述 1406. Stone Game III Alice 和 Bob 輪流玩取石頭的遊戲。 輸入陣列stoneValue 代表每顆石頭對應的價值。 規則如下: 每個人每回合可以從剩餘的石頭,從前面拿一顆、兩顆、或三顆石頭。 兩個人輪流交替拿。Alice先手,第一回合Alice
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 直線排列Permutations 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所有可能的情況,遞迴展開所有分
Thumbnail
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 直線排列Permutations 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所有可能的情況,遞迴展開所有分
Thumbnail
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 組合數之和 Combination Sum 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所以可能的情況,
Thumbnail
這篇文章,會帶大家快速回顧DFS+回溯法框架(還沒看過或想複習的可以點連結進去)。 用DFS+回溯法框架,解開 組合數之和 Combination Sum 的全系列題目。 幫助讀者鞏固DFS+回溯法框架這個重要的知識點。 回顧 DFS+回溯法框架 白話的意思 # 列舉所以可能的情況,
Thumbnail
這篇文章,會帶著大家複習以前學過的數列DP框架, 並且以費式數列、爬樓梯、骨牌拚接的應用與遞迴數列概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 數列DP與遞迴數列常見的形式 如果是遞迴數列,常常看到以函數型式表達
Thumbnail
這篇文章,會帶著大家複習以前學過的數列DP框架, 並且以費式數列、爬樓梯、骨牌拚接的應用與遞迴數列概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 數列DP與遞迴數列常見的形式 如果是遞迴數列,常常看到以函數型式表達
Thumbnail
這篇文章,會帶著大家複習以前學過的DFS框架 結合樹型DP, 並且以路徑和Path Sum的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): if base case or sto
Thumbnail
這篇文章,會帶著大家複習以前學過的DFS框架 結合樹型DP, 並且以路徑和Path Sum的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): if base case or sto
Thumbnail
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
Thumbnail
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
Thumbnail
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
Thumbnail
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
Thumbnail
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
Thumbnail
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
Thumbnail
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
Thumbnail
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
Thumbnail
這題乍看之下是新題目,但仔細一想, 其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。 題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。
Thumbnail
這題乍看之下是新題目,但仔細一想, 其實只是前面介紹過的費式數列的小變形而已,解題思想基本不變。 題目說每次可以爬一階樓梯或兩階樓梯,問爬到n階的方法數是多少。
Thumbnail
深入淺出,從最基本的 費式數列, 一探動態規劃的奧秘與精隨。
Thumbnail
深入淺出,從最基本的 費式數列, 一探動態規劃的奧秘與精隨。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News