動態(tài)規(guī)劃入門03

從遞歸轉(zhuǎn)換到動態(tài)規(guī)劃

如果一個遞歸函數(shù)有n個參數(shù),那就定義一個n維數(shù)組,數(shù)組的下標就是遞歸函數(shù)的取值范圍,數(shù)組元素的值是遞歸函數(shù)的返回值。
從邊界值開始,逐步填充數(shù)組,就相當于計算遞歸函數(shù)值的逆過程。
相當于一個從下到上的過程

DP的一般思路

1、把原問題分解成若干個子問題——當子問題全部解決的時候原問題即解決。子問題的解求出之后直接保存——每個子問題只求解一次。
2、確定狀態(tài)
一個“狀態(tài)”即為和子問題相關的各個變量的一組取值。一個“狀態(tài)”對應于一個或者多個子問題,所謂“某個狀態(tài)”的“值”,就是它所對應的子問題的解。
所有狀態(tài)的集合,構成問題的“狀態(tài)空間”——狀態(tài)空間的大小與時間復雜度直接相關。對于數(shù)字三角形,一共有N(N+1)/2個數(shù)字,因此狀態(tài)空間一共有N(N+1)/2個狀態(tài)。
對于數(shù)字三角形:
子問題——第i行j列的數(shù)字到底邊的最大和
跟子問題相關的變量——i,j
狀態(tài)——i,j的一組取值,即為狀態(tài)對應的子問題
狀態(tài)的值==子問題的解==(i,j)的最大和

有的時候K個整形變量構成一個狀態(tài),那么就用K維數(shù)組來存儲各個狀態(tài)的值——“值”可以是一個結(jié)構體。一個狀態(tài)的值通常會是一個或者多個子問題的解。

3、確定一個初始狀態(tài)(邊界狀態(tài))的值
初始狀態(tài)可以直接看出——對于數(shù)字三角形,初始狀態(tài)就是底邊數(shù)字,值即為底邊數(shù)字的值

4、確定狀態(tài)轉(zhuǎn)移方程
找出不同狀態(tài)之間如何轉(zhuǎn)移——從一個已知狀態(tài)到一個未知狀態(tài)。即從一個或者多個“值”已知的狀態(tài),求出另一個未知狀態(tài)的值——這個步驟可以用遞推公式表示,即為狀態(tài)轉(zhuǎn)移方程

什么時候使用DP

1、問題具有最優(yōu)子結(jié)構的性質(zhì)——即問題的最優(yōu)解所包含的子問題的解也是
最優(yōu)的
2、無后效性——當前若干個狀態(tài)的值不受路徑影響,只跟狀態(tài)有關

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,994評論 0 89
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,676評論 0 4
  • 在離我家大概二十米遠的巷子口,有一排老椿樹,那排樹長得枝繁葉茂,在十五年前,還沒有空調(diào)的夏天,是個乘涼的好地方。那...
    寧胡不喜閱讀 351評論 0 0
  • 有些時候會感覺正發(fā)生的事情, 曾經(jīng)發(fā)生過; 有些即將到來的事情, 曾經(jīng)夢見過; 假如有一天我穿越了, 無論是未來還...
    早起的蟲子有鳥吃閱讀 217評論 0 0

友情鏈接更多精彩內(nèi)容