動態規劃 矩陣鏈乘積

2021-10-06 07:44:09 字數 1409 閱讀 8745

確定n個矩陣連乘積 a1a2a3…an 的計算次序,使得按照這一次序計算矩陣連乘積,需要的"數乘"次數最小。

思路:

遞迴定義dp[

i,j]

dp[i,j]

dp[i,j

]如下:

對於i=j時的平凡問題,矩陣鏈只包含唯一的矩陣a

ia_i

ai​,因此不需要做任何標量乘法運算。所以,對所有i=1,2,…,n,dp[

i,i]

=0

dp[i,i]=0

dp[i,i

]=0。

若id p[

i,j]

dp[i,j]

dp[i,j

]就等於計算a(i…k)和a(k+1…j)的代價加上兩者相乘的代價的最小值。

由於矩陣ai的大小為x*y,易知a(i…k)和a(k+1…j)相乘的代價為aix

∗aky

∗ajy

a_ix*a_ky*a_jy

ai​x∗a

k​y∗

aj​y

次標量乘法運算。

因此,我們得到dp[

i,j]

=dp[

i,k]

+dp[

k+1,

j]+a

ix∗a

ky∗a

jy

dp[i,j]=dp[i,k]+dp[k+1,j]+ a_ix*a_ky*a_jy

dp[i,j

]=dp

[i,k

]+dp

[k+1

,j]+

ai​x

∗ak​

y∗aj

​y此公式假定最優分割點k是已知的,但實際上我們不知道。

但k只有j-i種可能的取值,即k=i,i+1,…,j-1。

由於最優分割點必在其中,我們只需檢查所有可能情況,找到最優者即可。

**:

#include

using

namespace std;

typedef

long

long ll;

const

int inf=

0x3f3f3f

;int

main()

stu[n]

;for

(int i=

0;i) cin>>stu[i]

.x>>stu[i]

.y;for

(int i=

0;i) dp[i]

[i]=0;

//鏈長度

for(

int len=

1;len} cout<[n-1

]<}}

動態規劃 矩陣鏈乘法

矩陣鏈乘法問題 給定n個矩陣的鏈,矩陣ai的規模為p i 1 p i 求完全括號化方案,使得計算乘積a1a2 an所需標量乘法次數最少。m i j 表示矩陣鏈ai j所需標量乘法次數的最小值。m i j 0 i j m i j m i k m k 1 j p i 1 p k p j i k s 1....

動態規劃 矩陣鏈乘法

兩個矩陣相乘的計算量,對於一般的矩陣乘法來說,如矩陣a m,n 與矩陣b n,p 相乘需要進行的加法次數為m n p次乘法 由於矩陣乘法滿足結合律,因此矩陣相乘的結合性,會影響整個計算表示式的乘法執行次數 如下面的例子,a b c三個矩陣相乘,其中a 10,5 b 5,20 c 20,3 1 ab ...

動態規劃 矩陣鏈乘法

def matrix multipy a,b 乘法得到的是乙個 a.rows,b.cols 的矩陣,相當於a.rows個向量的b.cols次的向量線性加權 ifnot a.shape 1 b.shape 0 a組中向量的維度與b組中向量的維度一致 print error else 將每乙個元素都初始...