首先讓我們看乙個例子:
例1:如下圖有乙個數字三角陣,請編乙個程式計算從頂點至底的某處的一條路徑,使該路徑所經過的數字的和最大。每一步可沿左斜線向下或右斜線向下走。
75 3
4 2 1
2 1 3 7
這個問題的實質實際上是乙個有向圖中最長路經問題,可以用經典的圖論演算法或者搜尋來解決。
考慮如何用搜尋法來解這道題,從第乙個點開始擴充套件,每次擴充套件2個可行節點,直到達到數字三角形的底部,從所有的可行路徑中找出最優值,這樣做的複雜度是o(2^n),當n很大的時候,普通的搜尋法將不可行。
觀察發現,搜尋的效率低下很大程度上是因為做了大量的重複運算,因為對於任何乙個節點,從他開始向下拓展的最優值是確定的,這啟發了我們應當充分利用之前的運算結果。
下面我們來進行深入的分析,假如已經走第i行第j列,此時最大累加和s[i,j]應選s[i-1,j],s[i-1,j+1]中較大者再加上(i,j)處的值a[i,j],即下式
s[i,j]=a[i,j]+max(s[i-1,j],s[i-1,j+1])
所以我們可以從第一行開始,向下逐行推出每一處位置的最大累加和s,最後從底行的n個s中選出最大的乙個即為所求,這種演算法的複雜度為o(n^2),比較搜尋法,已經大大的降低了,這種充分利用已經計算出結果的方法,就叫做動態規劃。
通過上面的例子,我們對「動態規劃」有了乙個初步認識,它所處理的問題是乙個「多階段決策問題」。我們現在對一些概念進行具體定義:
狀態(state):它表示事物的性質,是描述「動態規劃」中的「單元」的量。如例1中的每個節點(指節點處的最大值)都為單個的狀態。
階段(stage):階段是一些性質相近,可以同時處理的狀態集合。通常,乙個問題可以由處理的先後次序劃分為幾個階段。如例1中的問題,每一行若干節點組成乙個階段。乙個階段既可以包含多個狀態,也可以只包含乙個狀態。描述各階段狀態的變數稱為狀態變數,例1中可用s[4 , j]來表示第四階段(即第四行)走到第j列的最大值,即第四階段狀態變數。
狀態轉移方程:是前乙個階段的狀態轉移到後乙個的狀態的演變規律,是關於兩個相鄰階段狀態的方程,是「動態規劃」的中心。
如例1中: s[i,j]=a[i,j]+max(s[i-1,j],s[i-1,j+1])
決策(decision):每個階段做出的某種選擇性的行動。它是我們程式所需要完成的選擇。如例1中max(s[i-1,j],s[i-1,j+1])
動態規劃所處理的問題是乙個「多階段決策問題」,一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了乙個決策序列,同時確定了完成整個過程的一條活動路線(通常是求最優的活動路線)
從上面的講解我們可以發現:動態規劃並不像一種演算法,而更像一種思考方式。
下面,我們來討論動態規劃的應用範圍,要確定乙個問題是否能用動態規劃,需要考慮兩個方面:
一:最優子結構
即乙個問題的最優解只取決於其子問題的最優解,也就是說,非最優解對問題的求解沒有影響。我們再來看乙個問題:
例二:有4個點,分別是a、b、c、d,相鄰兩點用兩條連線,表示兩條通行的道路,給出每條道路的長度。我們定義從a到d的所有路徑中,長度除以4所得餘數最小的路徑為最優路徑。求一條最優路徑。
很多初學者往往會認為這道題也可以採用動態規劃的方法,但實際並不如此,考慮這種情況
假如a-b的兩條道路分別為2,3,b-c的兩條道路分別為1,4。如果採用動態規劃,節點b的最優值為2,節點c的最優值2,但際上到達c的最優值應該是0,即3-1這條線路。
也就是說,c的最優取值不是由b的最優取值決定的,其不具有最優子結構。
由此可見,並不是所有的「決策問題」都可以用「動態規劃」來解決。所以,只有當乙個問題呈現出最優子結構時,「動態規劃」才可能是乙個合適的侯選方法。
二:無後效性
即乙個問題被劃分階段後,階段i中的狀態只能由階段i-1中的狀態通過狀態轉移方程得來,與其他狀態沒有關係,特別是與未發生的狀態沒有關係,這就是無後效性。
<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>
經典題目推薦:
1.最長不下降子串行 o(n^2)版本
2.最長公共子串行
3.最小字母代價樹
4.石子合併
5.最優二叉樹
6.工作安排
7.揹包問題
8.加分二叉樹
9.錢幣問題
第一章 線性規劃
注意 請安裝 tex all the things 這款chrome瀏覽器外掛程式才能正確顯示公式。鏈結如下 一 線性規劃的matlab標準形式及軟體求解 begin begin x end end begin a cdot le b aeq cdot beq lb le le ub end rig...
python第一章筆記 第一章 基礎
參與除法的兩個數中有乙個數為浮點數,結果也為浮點數 如 1.0 2,1 2.0,1.0 2.0 python print 1.0 2 結果 0.5 print 1 2.0 結果 0.5 print 1.0 2.0 結果 0.5 整數 整數,計算結果的小數部分被截除,只保留整數部分 不會四捨五入 如 ...
第一章 人力資源規劃
1.答 1 崗位分析為企業選拔 任用合格的員工奠定了基礎。2 崗位分析為員工考核 晉公升提供了依據。3 崗位分析成為企業改進崗位設計 優化勞動環境的必要條件。4 崗位分析是企業制定有效的人力資源計畫,進行人才 的重要前提。5 崗位分析是崗位評價的基礎,而崗位評價又是建立 健全企業薪酬制度的重要步驟。...