演算法 · 11 個細項
Dynamic Programming動態規劃
DP 的核心是兩件事:子問題會重複出現、大問題的最佳解由子問題的最佳解組成。從記憶化開始,學會定義狀態、寫轉移式、決定順序,再看背包、序列、網格、區間、位元遮罩與樹上這幾種最常見的狀態設計。
為什麼要學 Dynamic Programming
現實中的應用細項
11 篇#演算法複雜度難度狀態
01Memoization & Tabulation 記憶化與表格法Fibonacci、Climbing Stairs,自頂向下與自底向上用在:任何有重疊子問題的遞迴,先加快取再說O(n)空間 O(n)可學習021-D DP 一維 DPHouse Robber、Decode Ways,狀態只跟前幾項有關用在:序列決策、簡單的排程與計數O(n)空間 O(1)可學習030/1 Knapsack 背包問題每個物品選或不選,二維表與空間壓縮用在:預算分配、投資組合、貨櫃裝載O(nW)空間 O(W)可學習04Unbounded Knapsack 完全背包物品可重複選,Coin Change 的 DP 版用在:找零最少硬幣數、無限供應的採購O(nW)空間 O(W)可學習05LIS 最長遞增子序列O(n²) 的 DP 與 O(n log n) 的耐心排序用在:股價趨勢分析、俄羅斯套娃信封問題O(n log n)空間 O(n)可學習06LCS 最長共同子序列二維表,相等就對角線加一用在:diff 工具、DNA 序列比對、抄襲比對O(mn)空間 O(mn)可學習07Edit Distance 編輯距離插入、刪除、取代三種操作的最小次數用在:拼字校正、模糊搜尋、語音辨識評分O(mn)空間 O(mn)可學習08Grid DP 網格路徑Unique Paths、Min Path Sum,只能往右或往下用在:機器人路徑計數、影像接縫裁切O(mn)空間 O(n)可學習09Interval DP 區間 DPBurst Balloons、矩陣鏈乘,枚舉分割點用在:最佳括號化、多邊形三角剖分O(n³)空間 O(n²)可學習10Bitmask DP 位元遮罩 DP用整數的位元表示集合狀態用在:TSP、小規模指派問題O(2ⁿ·n²)空間 O(2ⁿ·n)可學習11Tree DP 樹上 DP後序走訪,由子樹答案組合父節點答案用在:樹的直徑、最大路徑和、樹上獨立集O(n)空間 O(h)可學習