每次決策依賴當前的狀態,又隨即引起狀態的轉移,乙個決策的序列就是在變化的過程中產生出來的,最終優化決策解決問題
基本思想與分治法類似
在求解乙個子問題時列出可能的區域性解,通過決策保留哪些最有可能達到最優的區域性解
對其子問題有重疊的部分,對每乙個子問題只解一次,將其不同階段的不同狀態儲存在乙個二維陣列當中
與分治演算法的不同之處在於
(1)最優化原理:最優解包含的子問題也是最優
(2)無後效性:某個階段狀態一旦確定,就不受這個狀態以後決策的影響
(3)有重疊子問題,是動態規劃演算法相比其他演算法的優勢
求解的基本步驟
等價於乙個多階段決策問題
劃分階段:按照時間或空間特徵,要有序或者可以排序
確定狀態和狀態變數:將問題發展到個個階段時所處於的各種情況用不同的狀態表示出來,要滿足無後效性
確定決策並寫出狀態轉移方程:狀態轉移就是根據上一階段的狀態和決策來匯出本階段的狀態,所以如果確定了狀態,狀態轉移方程也就可以寫出來了,但事實是相反的根據兩個狀態之間的關係來確定決策方法和狀態轉移方程
尋找邊界條件:給出的狀態方程是乙個遞推式,需要乙個遞推的終止條件或邊界條件
解決問題的階段,狀態和狀態轉移決策確定了,就可以寫出狀態轉移方程
實際應用簡化步驟進行設計
分析最優解的性質,並刻畫其結構特徵
遞迴的定義最優解
以自底向上或自頂向下的記憶化方式計算出最優解
根據計算最優解得到的資訊構造問題的最優解
演算法實現的說明
最重要的是確定動態規劃三要素:問題的階段
每個階段的狀態
從前乙個階段轉化到後乙個階段之間的遞推關係
確定了三要素,整個求解過程就可以用乙個最優決策表來描述,二維表其行表示決策的階段其列表示問題狀態,**需要填寫的一般對應此問題某個階段某個狀態下的最優解(如最短路徑,最長公共子串行,最大價值),填表過程根據遞推關係,以行或列優先的順序,最後根據整個**的資料來進行簡單的取捨和運算得到問題的最優解。
f(n,m)=max
順便聊聊貪心演算法
其實貪心演算法是在某種意義上的區域性最優解,必須具備無後效性
基本思路
每天進步一點點
很多朋友總喜歡問 成功靠什麼?其實,成功很難單一的歸納為靠什麼條件,如果一定要回答,只能從某種意義上說 很多人的成功就是靠他們每天比別人 多做一點點 正如古人有云 業精於勤,荒於嬉。這裡所說的勤,也就是比別人多做一點點,即付出多一點的勞動和努力。不要小看這一點點,又如古語說 集腋成裘,積沙成丘。如果...
每天進步一點點
在模組化程式設計時,在子模組中宣告變數 例如unsigned char aa 不需要在標頭檔案中宣告 要在主函式中呼叫,要寫成 extern unsigned char aa 而不能寫成 extern aa 寫成extern aa 則無法改變aa的值。2014年9月22日 21 12 00 品質因數...
每天進步一點點(一)
最近接了第乙個商業專案,一人獨立完成從前台到後台,做了有幾天的時間,每天進步一點點,把每天看到的學到的記錄下來,以後也堅持。後台繼續用自己的extjs老本行,因為相比其他js庫,extjs用的比較熟,現成的 也有所以開發起來也比較容易,今天學到了兩個ext的新東西。一 ext和後台進行互動大部分用的...