動態規劃
動態規劃所處理的問題是乙個多階段決策問題,一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了乙個決策序列,同時確定了完成整個過程的一條活動路線(通常是求最優的活動路線)。如圖所示。動態規劃的設計都有著一定的模式,一般要經歷以下幾個步驟。
┌───┐┌───┐┌───┐
初始狀態→│決策1│→│決策2│→…→│決策n│→結束狀態
└───┘└───┘└───┘
圖1 動態規劃決策過程示意圖 (1)劃分階段:,按照問題的時間或空間特徵,把問題分為若干個階段。在劃分階段時,注意劃分後的階段一定要是有序的或者是可排序的,否則問題就無法求解。
(2)確定狀態和狀態變數:將問題發展到各個階段時所處於的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無後效性。
(3)確定決策並寫出狀態轉移方程:因為決策和狀態轉移有著天然的聯絡,狀態轉移就是根據上一階段的狀態和決策來匯出本階段的狀態。所以如果確定了決策,狀態轉移方程也就可寫出。但事實上常常是反過來做,根據相鄰兩段各狀態之間的關係來確定決策。
(4)尋找邊界條件:給出的狀態轉移方程是乙個遞推式,需要乙個遞推的終止條件或邊界條件。
(5)程式設計實現:動態規劃的主要難點在於理論上的設計,一旦設計完成,實現部分就會非常簡單。
根據上述動態規劃設計的步驟,可得到大體解題框架如圖2所示。
圖2 動態規劃設計的一般模式
上述提供了動態規劃方法的一般模式,對於簡單的動態規劃問題,可以按部就班地進行動態規劃的設計。
下面,給出乙個利用動態規劃方法求解的典型例子。
【例題6】數字三角形問題。圖3示出了乙個數字三角形寶塔。數字三角形中的數字為不超過100的整數。現規定從最頂層走到最底層,每一步可沿左斜線向下或右斜線向下走。
任務一:假設三角形行數≤10,鍵盤輸入乙個確定的整數值m,程式設計確定是否存在一條路徑,使得沿著該路徑所經過的數字的總和恰為m,若存在則給出所有路徑,若不存在,則輸出「no answer!」字樣。
任務二:假設三角形行數≤100,程式設計求解從最頂層走到最底層的一條路徑,使得沿著該路徑所經過的數字的總和最大,輸出最大值。
輸人資料:由檔案輸入資料,任務一中檔案第一行是三角形的行數n和整數值 m。以後的n行分別是從最頂層到最底層的每一層中的數字。任務二中檔案資料格式同任務一,只是第一行中沒有整數值m。在例子中任務二的檔案資料表示如下:
輸入:5
7 輸出:
3 8 7 輸出路徑和最大值
8 1 0 38 或「no answer!」字樣。
2 7 7 4 810
4 5 2 6 5 2744
圖3 數字三角形45265 【分析】對於這一問題,很容易想到用列舉的方法去解決,即列舉出所有路徑並記錄每一條路徑所經過的數字總和。然後判斷數字總和是否等於給定的整數值m或尋找出最大的數字總和,這一想法很直觀,而且對於任務一,由於數字三角形的行數不大(<=10),因此其列舉量不是很大,應該能夠實現。但對於任務二,如果用列舉的方法,當三角形的行數等於100時,其列舉量之大是可想而知的,顯然,列舉法對於任務二的求解並不適用。其實,只要對對任務二稍加分析,就可以得出乙個結論:
如果得到一條由頂至底的某處的一條最佳路徑,那麼對於該路徑上的每乙個中間點來說,由頂至該中間點的路徑所經過的數字和也為最大。因此該問題是乙個典型的多階段決策最優化的問題。演算法設計與分析如下:
對於任務一,合理地確認列舉的方法,可以優化問題的解法。由於從塔頂到底層每次都只有兩種走法,即左或右。設「0」表示左, 「1」表示右,對於層數為n的數字塔,從頂到底的一種走法可用乙個n-1位的二進位制數表示。如例中二進位制數字串1011,其對應的路徑應該是:8—1—4—6。這樣就可以用乙個n—l位的二進位制數來模擬走法和確定解的範圍。窮舉出從0到2
n-1個十進位制數所對應的n-1位二進位制串對應的路徑中的數字總和,判定其是否等於m而求得問題的解。
對於任務二,採用動態規劃中的順推解法。按三角形的行劃分階段,若行數為 n,則可把問題看做乙個n-1個階段的決策問題。從始點出發,依順向求出第一階段、第二階段……第n—1階段中各決策點至始點的最佳路徑,最終求出始點到終點的最佳路徑。
設:f
k(u
k)為從第k階段中的點uk至三角形頂點有一條最佳路徑,該路徑所經過的數字的總和最大,f
k(u
k)表示為這個數字和;
由於每一次決策有兩個選擇,或沿左斜線向下,或沿右斜線向下,因此設: u
k1為k-1階段中某點u
k沿左斜線向下的點; u
k2為k-1階段中某點u
k沿右斜線向下的點; d
k(u
k1)為k階段中u
k1的數字;d
k(u
k2)為k階段中u
k2的數字。
因而可寫出順推關係式(狀態轉移方程)為: f
k(u
k)=max(k=1,2,3,…,n) f
0(u
0)=0
經過一次順推,便可分別求出由頂至底n個數的n條路徑,在這n條路徑所經過的n個數字和中,最大值即為正確答案。
演算法 4 動態規劃
最長公共子串行 0 1揹包問題 二叉搜尋樹 參考文獻 動態規劃 dynamic programming 是運籌學的乙個分支,是求解決策過程 decision process 最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程 multistep decisi...
LeetCode 4 動態規劃
揹包問題c 動態規劃 class solution for int i 1 i n i for int j 0 j w weight i j for int i w i 0 i return0 1.word break leetcode 139 class solution return res s...
動態規劃 4 合併數
題目 求正數陣列內和為指定數字的合併總數 比如num 5,5,10,2,3 給定的合併值為 15 有4種 5 10,5 10,5 5 2 3,10 2 3 分析 這實際上是網易有道筆試題之一,我覺得我筆試通過主要就是依靠這個題目,因為其他的做的比較一般。這道題使用動態規劃思想,大家看如下的狀態轉移方...