算法设计与分析:(二)动态规划
目錄
- 設計思想
- 使用動態規劃的必要條件
- 適用動態規劃算法解決的問題的特征:
- 優化原則:
- 動態規劃的一般步驟
- 以背包問題為例
動態規劃本質上為帶備忘錄的窮舉算法。對動態規劃問題,直接套框架即可:問題有什么「狀態」,有什么「選擇」,然后窮舉。
設計思想
動態規劃算法適用于組合優化問題,通過劃分子問題的邊界,從子問題開始逐層向上求解,通過子問題之間的依賴關系進行推導計算,最大限度減少重復工作,提高算法效率。但需要較大的存儲空間來存儲子問題計算的中間結果。
使用動態規劃的必要條件
使用動態規劃的問題,必須滿足優化原則
-
適用動態規劃算法解決的問題的特征:
(1) 求解的問題是多階段決策(優化)問題
(2)求解的過程是多步判斷,從小到大依次求解每個子問題,最后求解的子問題即為原始問題
(3)子問題目標函數最優值之間存在依賴關系
(4)子問題符合「最優子結構」,即:子問題間必須互相獨立。 -
優化原則:
一個最有決策序列的任何子序列本身一定是相對于子序列的初始和結束狀態的最有決策序列
可以通俗理解為子問題間必須互相獨立。
啥叫相互獨立?你肯定不想看數學證明,我用一個直觀的例子來講解。
比如說,假設你考試,每門科目的成績都是互相獨立的。你的原問題是考出最高的總成績,那么你的子問題就是要把語文考到最高,數學考到最高…… 為了每門課考到最高,你要把每門課相應的選擇題分數拿到最高,填空題分數拿到最高…… 當然,最終就是你每門課都是滿分,這就是最高的總成績。
得到了正確的結果:最高的總成績就是總分。因為這個過程符合最優子結構,“每門科目考到最高”這些子問題是互相獨立,互不干擾的。
但是,如果加一個條件:你的語文成績和數學成績會互相制約,數學分數高,語文分數就會降低,反之亦然。這樣的話,顯然你能考到的最高總成績就達不到總分了,按剛才那個思路就會得到錯誤的結果。因為子問題并不獨立,語文數學成績無法同時最優,所以最優子結構被破壞。
動態規劃的一般步驟
明確「狀態」 -> 定義 dp 數組/函數的含義 -> 明確「選擇」-> 明確 base case。
首先要寫出所求解的組合優化問題的目標函數和約束條件
確定子問題的結構和邊界,將問題轉化為多步判斷的過程
確定問題是否滿足優化原則
找出子問題之間的依賴關系(優化函數)
找狀態轉移需要歸納思維,說白了就是如何從已知的結果推出未知的部分,如假設已知dp[i-1] 如何推出dp[i]
注意子問題的重疊程度,如果子問題重疊度較低,使用動態規劃算法在時間復雜度上不會有較大改進
從初值開始自底向上計算子問題的優化函數值
以背包問題為例
問題描述:有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,每件物品數量只有一個,現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?
寫出所求解的組合優化問題的目標函數和約束條件
設xi = 0|1,當xi=0表示第i件物品不放入背包,1則表示放入
設vi代表第i件物品的價值,wi代表第i件物品的重量
原問題即為求一個xi序列,使得總價V最大且總量W<10
目標函數為:
max(∑xi?vi)max(\sum xi*vi)max(∑xi?vi)
約束條件為:
∑xi?wi<=10\sum xi*wi <=10∑xi?wi<=10
確定子問題的結構和邊界,將問題轉化為多步判斷的過程
把原問題改為:當只能選擇前i件物品,背包容量為j時,背包的最大價值,用dp[i][j]表示。
確定問題是否滿足優化原則
背包問題滿足優化原則,證明過程省略…
找出子問題之間的依賴關系(優化函數)
關系為:dp[i][j] = max(dp[i-1][j],dp[i-1][j-wi]+vi)
說明:
dp[i][j]:當只能選擇前i件物品,且背包容量為j時,背包的最大價值。
max(dp[i-1][j],dp[i-1][j-wi]+vi)中dp[i-1][j]表示不放入第i件物品, dp[i-1][j-wi]+vi表示為放入第i件物品,騰出wi的重量后獲得的價值
從初值開始自底向上計算子問題的優化函數值
最后計算的子問題的解即為原始問題的解
總結
以上是生活随笔為你收集整理的算法设计与分析:(二)动态规划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水歌词 歌曲水的完整歌词
- 下一篇: FeignClient调用服务及上传文件