1、動態規劃基礎算法
雖然咱們在(一)中討論過動態規劃的裝配線問題,可是究竟何時使用動態規劃?那麼咱們就要清楚動態規劃方法的最優化問題中的兩個要素:最優子結構和重疊子問題。優化
一、最優子結構遞歸
1)若是問題的一個最優解包含了子問題的最優解,則該問題具備最優子結構。當一個問題具備最優子結構的時候,咱們就可能要用到動態規劃(貪心策略也是有可能適用的)。基礎
2)尋找最優子結構時,能夠遵循一種共同的模式:方法
a、問題的一個解能夠是一個選擇。例如,裝配站選擇問題。技術
b、假設對一個給定的問題,已知的是一個能夠致使最優解的選擇。沒必要關心如何肯定這個選擇,假定他是已知的。動態規劃
c、在已知這個選擇以後,要肯定那些子問題會隨之發生,以及如何最好的描述所的獲得的子問題空間。時間
d、利用一種「剪貼」技術,來證實在問題的一個最優解中,使用的子問題的解自己也必須是最優的。
3)最優子結構在問題域中以兩種方式變化:
a、有多少個子問題被使用在原問題的一個最優解中,以及
b、再決定一個最優解中使用那些子問題時有多少個選擇
在裝配線調度問題中,一個最優解只使用了一個子問題,可是,爲肯定一個最優解,咱們必須考慮兩種選擇。
4)動態規劃與貪心算法的區別
動態規劃以自底向上的方式來利用最優子結構。也就是說,首先找到子問題的最優解,解決的子問題,而後找到問題的一個最優解。尋找問題的一個最優解須要首先在子問題中作出選擇,即選擇用哪個來求解問題。問題解的代價一般是子問題的代價加上選擇自己帶來的開銷。
在貪心算法中是以自頂向下的方式使用最優子結構。貪心算法會先作選怎,在當時看來是最優的選擇,而後在求解一個結果子問題,而不是現尋找子問題的最優解,而後再作選擇。
二、重疊子問題
適用於動態規劃求解的最優化問題必須具備的第二個要素是子問題的空間要「很小」,也就是用來解原問題的遞歸算法能夠反覆的解一樣的子問題,而不是總在產生新的子問題。典型的,不頭痛的子問題數十輸入規模的一個多項式,當一個遞歸算法不斷的調用同一問題是,咱們說該最優問題包含重疊子問題。
動態規劃算法老是充分利用重疊子問題,即經過每一個子問題只解一次,吧解保存在一個須要時就能夠查看的表中,而每一次查表得時間爲常數。