演算法 7 動態規劃

2021-07-10 03:31:16 字數 4417 閱讀 2342

刻畫乙個最優解得結構特徵

遞迴的定義最優的解

計算最優解的值,通常採用自底而上的方法

利用計算資訊,構造最優解

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 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...