動態規劃 矩陣鏈相乘

2021-09-29 17:17:48 字數 1723 閱讀 6927

實驗題目3:矩陣鏈乘法 (11.1日實驗) 要求:

(1)設計暴力法,產生所有矩陣鏈相乘以組合情況,寫出**,並除錯成功;

(2)設計動態規劃演算法,寫出**,尋找最小乘法次數和對應相乘的順序,並除錯成功;(3)隨機產生由10個矩陣,測試(2)的**,輸出最小乘法次數和相乘的順序。

from random import

*def

matchain

(c,n,path,r)

:for d in

range(1

,n):

#填充對角線

for i in

range(1

,n-d+1)

: j=i+d

c[i]

[j]=

2147483647

#無窮大

for k in

range

(i+1

,j+1):

#k開始分割

if c[i]

[j]>

(c[i]

[k-1

]+c[k]

[j]+r[i]

*r[k]

*r[j+1]

):path[i]

[j]=k

c[i]

[j]=

min(c[i]

[j], c[i]

[k -1]

+ c[k]

[j]+ r[i]

* r[k]

* r[j +1]

)# i的行*k的行*j的列數

return c[1]

[n]def

findpath

(c,path,i,j)

:if i==j :

#只有乙個矩陣

print

(i,end='')

else

: k=path[i]

[j]#分割點

print

('('

,end='')

findpath(c,path,i,k-1)

#左邊 findpath(c,path,k,j)

#右邊print

(')'

, end='')

if __name__==

'__main__'

: r=

[randint(1,

10)for i in

range(11

)]r.insert(0,

-1)print

(r) path =[[

0for i in

range(11

)]for j in

range(11

)]c=[[

0for i in

range(11

)]for j in

range(11

)]count=matchain(c,

10,path,r)

print

(count)

# print(path)

findpath(c,path,1,

10)

執行結果為:

[-1, 10, 2, 5, 4, 3, 2, 9, 3, 9, 2, 6]

348(1(((((23)4)5)((67)(89)))10))

動態規劃 矩陣鏈相乘

設s1,a2,a3,an為n個矩陣的序列,其中ai為pi 1 pi階矩陣,這個矩陣鏈的輸入用向量p 給出。給定向量p,確定一種乘法次序,使得基本運算的總次數達到最小。我才用的矩陣為 a1 30 35 a2 35 15 a3 15 5 a4 5 10 a5 10 20 a6 20 25 那麼得到的p ...

動態規劃之矩陣鏈相乘

在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。問題描述 詳見演算法導論p197 p198 已知 給定n個矩陣構成的乙個矩陣鏈 a1,a2,an 矩陣ai的維數為pi 1 pi 求 決定該矩陣鏈的乘法結合順序 即加括號 使得矩陣鏈乘法的執行時間最短 ...

動態規劃之矩陣鏈相乘

題目 n個矩陣連乘,求最少的乘法運算次數以及結合方式 假設矩陣a為r1 r2,矩陣b為r2 r3,所以m a b r1 r2 r3。當有多個矩陣相乘的時候,矩陣以不同的方式結合的時候其運算次數是不同的。例如 m m1 m2 m3 m4 5 20 20 50 50 1 1 100 m1 m2 m3 m...