刻畫乙個最優解得結構特徵
遞迴的定義最優的解
計算最優解的值,通常採用自底而上的方法
利用計算資訊,構造最優解
cut-rod(p,n): 長度為n,**陣列p[1…n]
1. if n==0
2. return 0
3. q=-無窮
4. for i= 1 to n
5. q=max(q,p[i]+cut-rod(p,n-i))
6. return q
複雜度是指數級別
memoized-cut-rod(p,n) : 將r[0...n]初始化為-無窮
1.let r[0..n] be a new array
2.for i=0
to n
3. r[i]=-無窮
4.return memoized-cut-rod-aux(p,n,r)
memoized-cut-rod-aux(p,n,r)
1.if r[n]>=0
//檢查是否r[n]已知
2.return r[n] //存在返回儲存的值
3.if n==0
4. q=0
5.else q=-無窮
6.for i=1
to n
7. q=max(q,p[i]+memoized-cut-rod-aux(p,n-i,r))
8. r[n]=q // q 存入 r
9.return q
bottom-up-cut-rod(p,n)
1. let r[0..n] be a new array
2. r[0]=0
3. for j=1 to n
4. q=-無窮
5. for i=1 to j
6. q=max(q,p[i]+r[j-i])
7. r[j]=q
8. return r[n]
計算最大收益rj
和對於的長度sj
extended-bottom-cut-rod(p,n)
1.let r[0..n] and s[0..n] be new arrays
2. r[0]=0
3.for j=1
to n
4. q=-無窮
5.for i=1
to j
6.if q7. q=p[i]+r[j-i]
8. s[j]=i
9. r[j=q]
10.return r and s
//print-cut-rod-sulution(p,n)
1. (r,s)=extended-bottom
-cut
-rod(p,n)
2.while n>
03. print s[n]
4. m=n-s
[n]
刻畫乙個最優解的結構特徵
地規定以最優解的值
計算最優解,採用自低向上的方法
利用計算出的資訊構造 最優解
//maxtrix-chain-order(p)
1. n=p.length-1
2.let m[1..n,1..n] 和 s[1..n-1, 2..n] be new tables
3.for i=1
to n
4. m[i,i]=0
5.for l=2
to n //l is the chain length
6.for i=1
to n-l+1
7. j=i+l-1
8. m[i,j]=無窮
b>是x
=《a,
b,c,
b,d,
a,b》
的子串行,對應的下標是:<2,3,5,7>
x=b,c,
b,d,
a,b>和y
=
d,c,
a,b,
a>的公
共最長子
序列是
c,b,
a> 令
x=,x2,
....
..,x
m>和y
=,y2,
....
..,y
n>,z
=,...
..,z
k>為x
和y的任
意lcs
若xm=yn
,則zk
=xm=
yn,且
zk−1
是xm−
1和yn
−1的一
個lcs
xm≠yn,則
zk≠x
m,則z
是xm−
1和y的
乙個公共
子串行 xm
≠yn,
則zk≠
yn,則
z是x和
yn−1
的乙個公
共子串行
輸入:x=
,x2,
...,
xm>和y
=,y2,
...,
yn>
c[i ,j ] 儲存在表 c[0 .. m, 0 .. n] 中
b[i ,j] 指向的表項對應計算c[i, j]時所選擇的子問題的最優解
lcs-length(x,y)
1. m=x.length
2. n=y.length
3. let b[1..m,1..n] and c[0 .. m, 0..n] be new tables
4.for i= 1
to n
5. c[i,0]=0
6.for j=0
to n
7. c[0,j]=0
8.for i=1
to m
9.for j=1
to n
10.if x_i==y_i
11. c[i,j]=c[i-1,j-1]+1
12. b[i,j]="向上箭頭"
13.else c[i-1,j]>=c[i,j-1]
14. c[i,j]=c[i-1,j]
15. b[i,j]="|"
16.else c[i,j]=c[i,j-1]
17. b[i,j]="橫線"
3.if b[i,j]=="斜向上箭頭"
4.print-lcs(b,x,i-1,j-1)
5.print x_i
6.else
if b[i,j]=="向上箭頭"
7.print-lcs(b,x,i-1,j)
8.else
print-lcs(b,x,i,j-1)
演算法實驗7 動態規劃投資問題
設m元錢,n項投資,函式f x 表示將x元投入第i項專案所產生的效益,i 1,2,n.問 如何分配這m元錢,使得投資的總效益最高?例項 問題轉換 假設分配給第 i 個專案的錢數是 xi,問題描述為 目標函式max 約束條件x1 x2 xn m,xi n 遞推公式 設f x 表示x萬元投給前k個專案的...
演算法 動態規劃
動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...
演算法 動態規劃
1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...