•動態規劃演算法的設計步驟
–分析優化解的結構
–遞迴地定義最優解的代價
–自底向上地計算優化解的代價儲存之,並獲取構造最優解的資訊
–根據構造最優解的資訊構造優化解
•使用dynamic programming的條件 –
optimal substructure
(優化子結構)
•當乙個問題的優化解包含了子問題的優化解時,我們說這個問題具有優化子結構。
•縮小子問題集合,只需那些優化問題中包含的子問題,減低實現複雜性
•優化子結構使得我們能自下而上地完成求解過程 –
subteties
(重疊子問題)
•在問題的求解過程中,很多子問題的解將被多次使用
最長公共子串行(longest common
susequence)
公共子串行
–z是序列x與y的公共子串行,如果z是x的子序也是y的子串行。
最長公共子串行(lcs)問題
輸入:x = (x1,x2,...,xn),y = (y1,y2,...ym)
輸出:z = x與y的最長公共子串行
x和y的lcs的優化解結構為
子問題重疊性
遞迴方程
•計算lcs長度的演算法 –
資料結構
c[0:m,0:n]:
c[i,j]是
xi與y
j的lcs的長度
b[1:m,1:n]:
b[i,j
]是指標,指向計算
c[i,j
]時所選擇的子問題的優化解
所對應的
c表的表項
列印最長子序列
•基本思想 –
從b[m, n]
開始按指標搜尋 –
若b[i, j]=「↖
」,則x
i=yj
是lcs
的乙個元素 –
如此找到的
「lcs」是
x與y的
lcs的
inverse
print-lcs(b, x,i, j)
if i=0 or j=0 then return;
if b[i, j]=「↖」
then print-lcs(b, x, i-1, j-1); print xi;
else if b[i, j]=「↑」
then print-lcs(b, x, i-1, j);
else print-lcs(b, x, i, j-1).
矩陣鏈乘法
問題描述
•輸入:, ai是矩陣
•輸出:計算a1´a2´...´an的最小代價方法
問題特徵
–矩陣乘法滿足結合率。
–計算乙個矩陣鏈的乘法可有多種方法:
–不同計算順序有不同的代價
矩陣鏈乘法優化問題的解空間
–設p(n)=計算n個矩陣乘積的方法數
–p(n)的遞迴方程
優化解的結構
–若計算a1~n的優化順序在k處斷開矩陣鏈, 即a1~n=a1~kxak+1~n,則在a1~n的優化順序中,對應於子問題a1~k的解必須是a1-k的優化解,對應於子問題ak+1~n的解必須是ak+1~n的優化解。
考慮到所有的k,優化解的代價方程為
m[i, j] =計算ai ~j的最小乘法數
子問題重疊性
演算法偽**:
演算法複雜性分析
•時間複雜性 –
計算代價的時間
•(l,
i, k)
三層迴圈
,每層至多
n-1步
•o(n3)
–構造最優解的時間
:o(n)
–總時間複雜性為:
o(n3)
•空降複雜性 –
使用陣列m和
s – 需要空間
o(n2)
演算法設計 動態規劃問題
適合採用動態規劃 dynamic programming 方法的最優化問題中的兩個要素 最優子結構和重疊子問題。最優子結構 用動態規劃求解最優化問題的第一步就是刻畫最優解的結構,如果乙個問題的解結構包含其子問題的最優解,就稱此問題具有最優子結構性質。因此,某個問題是否適合應用動態規劃演算法,它是否具...
演算法設計與分析 動態規劃
最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...
演算法設計與分析 動態規劃
分治技術的問題 子問題是相互獨立的 如果子問題不是相互獨立的,分治演算法將重複計算公共子空間,效率很低 提高效率的方法 從規模最小的子問題開始計算 用恰當資料結構儲存子問題的解,供以後查詢 確保每個子問題只求解一次 優化問題 給定一組約束條件和乙個代價函式,在解空間中搜尋具有最小或最大代價的優化解 ...