數據結構與算法 - 06 動態規劃

  • 判斷動態規劃 - 同時滿足以下條件
    • 1.是數學優化對方法 - 最優子結構
      • 一個問題的最優解,是由它對各個子問題的最優解決定的
      • 狀態轉移方程 f(n)
    • 2. 是編程的方法 - 重疊子問題
      • 保證每個重疊的子問題,只會被求解一次
  • 解題思路
    • 1. 找最優子結構:輸入規模對半分
    • 2. 找最優子結構:每次減一個
    • 3. 找重疊子問題
  • 解決動態規劃問題對兩個難點
    • 1. 如何定義 f(n)
    • 2. 如何通過 f(1),f(2),... f(n-1) 推導出 f(n),即 狀態轉移方程
  • 求解方式
    • 遞歸 - 解 狀態轉移方程式
      • 缺點:耗費非常多的重複計算
    • 記憶化 Memoization
      • 避免重疊計算
      • 將已經計算出來的結果保存起來,下次遇到時,直接返回,節省計算時間
    • 自底向上 Bottom-Up
      • 通過狀態轉移方程,從最小對問題規模入手
      • 不斷地增加問題規模,直到達到所要求的問題規模爲止
      • 使用 記憶化 避免重複計算
  • 編碼實現對兩個難點
    • 1. 應當採用什麼樣的數據結構來保存什麼樣對計算結果
      • 往往是在把問題規模縮小對過程中進行
      • 不僅是爲了避免重複的計算,也是推導狀態轉移方程的關鍵
    • 2. 如何利用保存下來的計算結果推導出狀態轉移方程
  • 動態規劃分類
    • 1. 線性規劃
      • 子問題的規模以線性的方式分佈
      • 結果可以存儲在一維線性數據結構裏,如:一維數組、哈希表等
    • 2. 區間規劃
      • 各個子問題的規模由不同的區間來定義
      • 結果存儲在二維數組裏
      • 一般用 dp[i][j] 代表從第 i 個位置到 第 j 個位置之間對最佳狀態或結果
    • 3. 約束規劃
      • 在上述一般解法的基礎上,加入限制或約束條件
    • 一個問題的最優解,是由它對各個子問題的最優解決定的
    • 狀態轉移方程 f(n)
    • 2. 是編程的方法 - 重疊子問題
      • 保證每個重疊的子問題,只會被求解一次
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章