動態規劃演算法

2021-07-25 14:57:09 字數 2978 閱讀 7105

動態規劃:通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題最優子結構性質的問題。

演算法總體思想

演算法的基本步驟

演算法的基本要素:

最優子結構

重疊子問題

備忘錄方法

問題描述:

子串行

公共子串行

最長公共子串行(lcs)問題

問題分析

動態規劃求解lcs問題:

最長公共子串行問題具有最優子結構性質

定義遞迴解(分析子問題的遞迴結構)

建立遞迴關係(遞迴地定義最優值)

計算lcs的長度(最優值)

**:

def

lcs(a, b):

lena = len(a)

lenb = len(b)

c = [[0

for i in range(lenb + 1)] for j in range(lena + 1)]

flag = [[0

for i in range(lenb + 1)] for j in range(lena + 1)]

for i in range(lena):

for j in range(lenb):

if a[i] == b[j]:

c[i + 1][j + 1] = c[i][j] + 1

flag[i + 1][j + 1] = 'ok'

elif c[i + 1][j] > c[i][j + 1]:

c[i + 1][j + 1] = c[i + 1][j]

flag[i + 1][j + 1] = 'left'

else:

c[i + 1][j + 1] = c[i][j + 1]

flag[i + 1][j + 1] = 'up'

return c, flag

defprintlcs

(flag, a, i, j):

if i == 0

or j == 0:

return

if flag[i][j] == 'ok':

printlcs(flag, a, i - 1, j - 1)

print a[i - 1]

elif flag[i][j] == 'left':

printlcs(flag, a, i, j - 1)

else:

printlcs(flag, a, i - 1, j)

a = 'abcbdab'

b = 'bdcaba'

c, flag = lcs(a, b)

for i in c:

print i

print

''for j in flag:

print(j)

print

''printlcs(flag, a, len(a), len(b))

print

''

問題描述:演算法設計:**:

int maxsum (int n, int *a) 

return

sum;

}

問題描述:給定:n種物品和乙個揹包

約束條件:

問題:如何選擇物品,使揹包中物品的總價值最大?

遞迴定義最優值:

設所給0-1揹包問題的子問題的最優值為:m(

i,c)

根據最優子結構性質可以建立如下遞迴式:

演算法示例:

下表是至底向上,從左到右生成的。其中,第5行表示只有第5個物品時,揹包容量不同的情況下所對應的最大總價值;第4行表示有4,5兩個可選物品時的揹包最大總價值。

用子問題定義狀態:即f[i][c]表示前i件物品恰放入乙個容量為c的揹包可以獲得的最大價值。則其狀態轉移方程便是:

max(f[i-1][c], f[i-1][c-w[i]]+v[i])
這個式子表示,在前i件物品放進容量c的揹包時,考慮兩種情況

最後比較第一種與第二種所得價值的大小,哪種相對大,f[i][c]的值就是哪種。

完整**如下:

capacity = 10

w = [4, 5, 6, 2, 2]

v = [6, 4, 5, 3, 6]

f = [[-1

for i in range(capacity+1)] for j in range(len(w))]

defget_f

(i, c):

if i == 0:

return v[i] if w[i] <= c else

0else:

if c >= w[i]:

return max(f[i-1][c], f[i-1][c-w[i]]+v[i])

else:

return f[i-1][c]

for c in range(capacity+1):

for i in range(len(w)):

f[i][c] = get_f(i, c)

print f

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...

動態規劃演算法

動態規劃演算法 2011年03月28日 b 動態規劃演算法 b b 作者 july 二零一零年十二月三十一日 b 本文參考 微軟面試100題系列v0.1版第19 56題 演算法導論 維基百科。ok,咱們先來了解下什麼是動態規劃演算法。動態規劃一般也只能應用於有最優子結構的問題。最優子結構的意思是區域...