動態規劃在查找有不少重疊子問題的狀況的最優解時有效。它將問題從新組合成子問題。爲了不屢次解決這些子問題,它們的結果都逐漸被計算並被保存,從簡單的問題直到整個問題都被解決。所以,動態規劃保存遞歸時的結果,於是不會在解決一樣的問題時花費時間。code
動態規劃只能應用於有最優子結構的問題。**最優子結構的意思是局部最優解能決定全局最優解(對有些問題這個要求並不能徹底知足,故有時須要引入必定的近似)。**簡單地說,問題可以分解成子問題來解決。遞歸
這個思路和概括法有類似的地方:方法
證實當n等於任意一個天然數時某命題成立。證實分下面兩步:動態規劃
證實當n := 1時命題成立。時間
證實若是在n := m時命題成立,那麼能夠推導出在n := m+1時命題也成立。(m表明任意天然數)co
鋼條切割問題:給定一段長度爲n英寸的鋼條和一個價格表 (i=1,2, …,n,i是整數),求切割鋼條的方案,使得銷售收益最大。揹包問題
若鋼條的長度爲i,則鋼條的價格爲P[i],如何對給定長度的鋼條進行切割能獲得最大收益?
長度i 1 2 3 4 5 6 7 8 9 10
價格p[i] 1 5 8 9 10 17 17 20 14 30
解決方法:
假設長度爲n時,最大收益是r[n]。
r[0] = 0; r[1] = 1; r[n] = max{ p[n], r[1] + r[n-1], r[2] + r[n-2], ......., r[n-1] + r[1] }
什麼是公共子序列?
令X和Y是兩個有序的序列,X = [x1, x2, ..., xm],Y = [y1, y2, ......, yn]。Z是X和Y的一個公共子序列,Z=[z1, z2, ......, zk]。
一、Z中的全部元素在X中都有,在Y中也都有。
二、Z中全部元素的在X中和在Y中的出現次序是相同的。
如今要求X = [x1, x2, ..., xm],Y = [y1, y2, ......, yn]最長公共子序列的長度。
解決方法:
設c[i, j]表示X[1...i]和Y[1...j]這兩個序列的LCS的長度。
有:
若i=0 or j=0,c[i, j] = 0
若X[i] == Y[j], c[i, j] = c[i-1, j-1] +1
若X[i] != Y[j], c[i, j] = max( c[i, j-1], c[i-1, j] )
有物品1, 2, ..., n,重量分別是w1, w2, ..., wn,重量是整數,價值分別是p1, p2, ..., pn,每種物品數量沒有上限。一個揹包能夠承受的最大重量爲W。
問題:如何讓放在書包裏的物品總價值最大?
解決方法:
假設A(Y)是總重量不超過Y時,所能達到的最大的總價值。
有:
A[0] = 0
A(Y) = max{ A(Y-1), p1 + A(Y - w1), ..., pn + A(Y - wn)}
總重量爲Y時揹包的最高價值可能有兩種狀況,第一種是該重量沒法被徹底填滿,這對應於表達式A(Y - 1)。第二種是恰好填滿。