動態規劃:通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。
演算法總體思想
演算法的基本步驟
演算法的基本要素:
最優子結構
重疊子問題
備忘錄方法
問題描述:
子串行
公共子串行
最長公共子串行(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,咱們先來了解下什麼是動態規劃演算法。動態規劃一般也只能應用於有最優子結構的問題。最優子結構的意思是區域...