確定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
aix∗a
ky∗
ajy
次標量乘法運算。
因此,我們得到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]+
aix
∗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 將每乙個元素都初始...