動態規劃問題總結【學習中】

DP總覽

問題特色

計數(多少種)

  • Li114,多少種路徑
  • 多少種方法選出k個數,使得和是sum

最大值

  • Li669,硬幣的最少個數
  • Li397,最長上升子序列

存在性(可行性、可否)

  • Li116,可否跳到最後一塊石頭

解題步驟

  1. 肯定狀態數組

    • 考慮最後一步(最後一個物品,最後一個路徑)
    • 變成解決子問題了(規模更小的問題)
    • 狀態就是 f 對應的 dp
  2. 肯定狀態轉移方程優化

    • dp[i] 和 f(i) 不徹底同樣 P2O_2e 14Li515
    • dp[i]的計算順序(從大到小仍是從小到達)有影響 0-1揹包
  3. 分析初始條件邊界狀況編碼

    • 初始條件:開始的幾項,和後面規則不同的值
    • 邊界狀況:數組下標越界時,沒法實現的狀況的dp值(-1,無窮仍是什麼)
  4. 肯定計算dp的順序code

    • 原則就是計算須要的都是以前計算的結果
    • 通常都是從小到大,揹包問題的空間優化必須反向計算

空間優化

  • 使用滾動數組, 根據狀態轉移方程中須要的最舊的數據肯定大小
  • dp[i % n]代替dp[i]是最方便, 最好理解的解決辦法, 其中n是壓縮後的數組大小
  • 通常是逐行掃描, 滾動數組長度是列數的倍數。 若是列多行少時, 能夠考慮逐列掃描讓滾動數組長度是列數的倍數, 進一步優化空間

座標型20%

簡單例題

Li114 不一樣路徑for循環

Li115 不一樣路徑,網格中有障礙循環

問題特色

  • 給定一個序列或者網格方法

  • 狀態dp[i]的含義是以a[i]結尾的子序列的性質數據

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%

相關文章
相關標籤/搜索