对一系列的矩阵进行乘法运算,求最佳的运算结合顺序,使得所需的乘法总次数最少。
我们知道,矩阵连乘满足结合律,如对于四个矩阵相乘 ABCD,有
ABCD = (ABC)D = (AB)(CD) = A(BCD) = ...
但是结合顺序不同,所需要的乘法总次数也就不同,如对于三个矩阵连乘 A[10*30] * B[30*5] * C[5*60],有两种结合顺序,每种结合顺序所需的乘法总次数如下:
(AB)C = (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 次 A(BC) = (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 次
不难看出第一种结构顺序的乘法总次数比第二种的少得多。
现给定一维数组 p[],用于表示系列矩阵的行列数,第 i 个矩阵的行列数为 p[i-1]*p[i],试编程计算所需的最少乘法总次数是多少。如
Input: p[] = {40, 20, 30, 10, 30}
四个矩阵的维数分别为 40x20, 20x30, 30x10 and 10x30
Output: 26000
最优结合顺序为 (A(BC))D --> 20*30*10 + 40*20*10 + 40*10*30
Input: p[] = {10, 20, 30, 40, 30}
Output: 30000
((AB)C)D --> 10*20*30 + 10*30*40 + 10*40*30
Input: p[] = {10, 20, 30}
Output: 6000
There are only two matrices of dimensions 10x20 and 20x30. So there
is only one way to multiply the matrices, cost of which is 10*20*30
分析:求最优结合顺序,其实就是找出最优的加括号顺序。最简单的办法就是在所有可能的地方加括号,计算每种加括号的顺序所需的乘法次