用动态规划求解矩阵链相乘的最少乘积次数的问题(C++实现)
矩阵链相乘 的问题描述
我们就不具体阐述这个问题的定义了。为了能够更加直白地让读者了解什么是矩阵链相乘的最小乘积次数问题,我们举个简单的例子:
假设有三个矩阵,分别是
M 1 M_1 M1:
( 1 1 1 1 1 1 1 1 1 1 ) \begin{pmatrix} 1 & 1 \\ 1 & 1 \\ 1 & 1 \\ 1 & 1 \\ 1 & 1 \\ \end{pmatrix} ⎝⎜⎜⎜⎜⎛1111111111⎠⎟⎟⎟⎟⎞
M 2 M_2 M2:
( 1 1 1 1 1 1 1 1 ) \begin{pmatrix} 1 & 1 & 1 & 1\\ 1 & 1 & 1 & 1\\ \end{pmatrix} (11111111)
M 3 M_3 M3:
( 1 1 1 1 1 1 1 1 1 1 1 1 ) \begin{pmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \\ \end{pmatrix} ⎝⎜⎜⎛111111111111⎠⎟⎟⎞
这个问题就是要找到一个分割方式,使得矩阵相乘 M 1 ∗ M 2 ∗ . . . ∗ M n M_1*M_2*...*M_n M1∗M2∗...∗Mn最后在乘法上计算的次数最少。
比如我们这个问题, M 1 M_1 M1是一个 5 ∗ 2 5*2 5∗2(5行2列)的矩阵, M 2 M_2 M2是一个 2 ∗ 4 2*4 2∗4的矩阵, M 3 M_3 M3是一个 4 ∗ 3 4*3 4∗3的矩阵,其实这个问题和矩阵的元素无关,只和矩阵的行数和列数相关,因此,上边的矩阵的元素我都填的1,没有什么影响。3个矩阵相乘有两种乘法,即
- ( M 1 M 2 ) M 3 (M_1M_2)M_3 (M1M2)M3,即先前两个矩阵相乘,然后再乘以第三个矩阵;
- M 1 ( M 2 M 3 ) M_1(M_2M_3) M1(M2M3),即先后两个矩阵相乘,然后再和第一个矩阵相乘。
- 对于第1种情况, M 1 M_1 M1乘以 M 2 M_2 M2需要进行 5 ∗ 2 ∗ 4 = 40 5*2*4=40 5∗2∗4=40 次乘法运算,得到一个5行4列的矩阵 M M M,然后 M