DP總覽
問題特色
計數(多少種)
- Li114,多少種路徑
- 多少種方法選出k個數,使得和是sum
最大值
- Li669,硬幣的最少個數
- Li397,最長上升子序列
存在性(可行性、可否)
解題步驟
-
肯定狀態數組
- 考慮最後一步(最後一個物品,最後一個路徑)
- 變成解決子問題了(規模更小的問題)
- 狀態就是 f 對應的 dp
-
肯定狀態轉移方程優化
- ❗ dp[i] 和 f(i) 不徹底同樣
P2O_2e 14
,Li515
- dp[i]的計算順序(從大到小仍是從小到達)有影響
0-1揹包
-
分析初始條件和邊界狀況編碼
- 初始條件:開始的幾項,和後面規則不同的值
- 邊界狀況:數組下標越界時,沒法實現的狀況的dp值(-1,無窮仍是什麼)
-
肯定計算dp的順序code
- 原則就是計算須要的都是以前計算的結果
- 通常都是從小到大,揹包問題的空間優化必須反向計算
空間優化
- 使用滾動數組, 根據狀態轉移方程中須要的最舊的數據肯定大小
- 用
dp[i % n]
代替dp[i]是最方便, 最好理解的解決辦法, 其中n是壓縮後的數組大小
- 通常是逐行掃描, 滾動數組長度是列數的倍數。 若是列多行少時, 能夠考慮逐列掃描讓滾動數組長度是列數的倍數, 進一步優化空間
座標型20%
簡單例題
Li114 不一樣路徑for循環
Li115 不一樣路徑,網格中有障礙循環
問題特色
Li397 最長連續單向子序列co
Li110 路徑數字和的最小值block
Li553 炸彈襲擊
序列型20%
簡單例題
Li515 刷房子
問題特色
- 狀態dp[i]的含義是前i個元素的性質
- 初始化時,dp[0]表示空序列的性質
- ❗ for循環裏
i <= n
, 常常寫成i < n
,致使輸出0
Li556 刷房子, O(n*k)
Li644 數位中1的個數
L198_Li392 打家劫舍
劃分型20%
簡單例題
Li512 編碼解析方法
區間型15%
揹包型10%
載重W的揹包,N件待選物品,物品屬性:重量w,價值v
0-1揹包
列表中的物品只有一個
徹底揹包
列表種的物品有任意個
最長序列型5%
博弈型5%
綜合型5%