演算法導論 動態規劃之矩陣鏈乘法Python實現

2021-09-12 15:49:35 字數 1236 閱讀 3771

求多個矩陣相乘的最優計算順序,使得計算量最低13

6254

p = [30, 35, 15, 5, 10, 20, 25] 

def matrix_chain_order(p):

n = len(p) - 1 # 矩陣個數

m = [[0 for i in range(n)] for j in range(n)]

s = [[0 for i in range(n)] for j in range(n)] # 用來記錄最優解的括號位置

for l in range(1, n): # 控制列,從左往右

for i in range(l-1, -1, -1): # 控制行,從下往上

m[i][l] = float('inf') # 儲存要填充格仔的最優值

for k in range(i, l): # 控制分割點

q = m[i][k] + m[k+1][l] + p[i]*p[k+1]*p[l+1]

if q < m[i][l]:

m[i][l] = q

s[i][l] = k

return m, s

def print_option_parens(s, i, j):

if i == j:

print('a'+str(i+1), end='')

else:

print('(', end='')

print_option_parens(s, i, s[i][j])

print_option_parens(s, s[i][j]+1, j)

print(')', end='')

r, s = matrix_chain_order(p)

print_option_parens(s, 0, 5)

>>> lists =  * 3

>>> lists

[, , ]

>>> lists

[[3], [3], [3]]

123

4567

891011

1213

1415

16

- 輸出1 2 6 3 7 11 4 8 12 16

- 輸出1 6 2 11 7 3 16 12 8 4(本題的輸出順序)

- 輸出1 6 2 3 7 11 16 12 8 4

- 輸出上述三種方式的逆順序

演算法導論 動態規劃之矩陣鏈乘法

原題見pdf204頁 a0a1a2a3a4a5 定義 a i 的維數為p i p i 1 m i j 為重a i 乘到a j 標量乘法運算的最小次數。m i j 0,當i j時 加入要求解的是m 0 2 則m 0 2 為m 0 0 m 1 2 p 0 p 1 p 3 m 0 1 m 2 2 p 0 ...

動態規劃之矩陣鏈乘法

雖然我們在 動態規劃之鋼條切割 裡面已經介紹過動態規劃的相關知識,這裡還是提一下動態的兩大特徵 1.最優子結構,原問題的解是在子問題的最優解的基礎上建立起來的 2.重疊子問題,即在不斷求解子問題的過程中會產生相同的子問題,而不是一直產生新的子問題 現在我們來看乙個例子,假設有三個矩陣 a1 10,1...

動態規劃之矩陣鏈乘法

給定乙個n個矩陣的序列,我們希望計算它的乘積 a1a2a3.an,我們可以用括號標定計算次序,然後再利用標準的矩陣乘法演算法來計算,由於矩陣乘法滿足結合律,所以任何一種計算順序最後的計算結果都是相同的。完全括號化的矩陣乘積鏈 它是單一矩陣,或者兩個完全括號化的矩陣乘積鏈的積,並且已經外加括號 例如矩...