问题
给出一个长度为的序列
表示
个矩阵
其中分别表示第
个矩阵的行和列
将个矩阵按顺序相乘,最少需要做多少次乘法
解析
对于行列分别为和
的两个矩阵相乘,共需要
次乘法
同时对于矩阵乘法,满足结合律但不满***换律,即
例如:对于序列表示矩阵
- 按照原顺序,总运算次数为
- 先对后两项做乘法,总运算次数为
显然不同的结合顺序会使总运算次数产生很大区别
做法:
我们考虑用动态规划的方法来解决这个问题
令表示第
到
各矩阵按一定顺序相乘的最小乘法次数
则
- 证明满足最优化法则
- 已知
是当前子问题的最优答案
- 假设
不是最优的子问题答案,即存在
- 那么
- 也就是存在更优的
,这与之前的假设相矛盾,得证
- 已知
设计
for (int i = 1; i <= n - 1; ++i) dp[i][i] = 0, s[i][i] = i; for (int len = 2; len <= n - 1; ++len) { for (int l = 1, r; l + len - 1 <= n - 1; ++l) { r = l + len - 1; int cur = a[l] * b[r]; for (int k = l; k < r; ++k) { if (dp[l][k] + dp[k + 1][r] + cur * b[k] < dp[l][r]) { s[l][r] = k; dp[l][r] = dp[l][k] + dp[k + 1][r] + cur * b[k]; } } } }
分析
对于上述算法,共有3重循环,其中第一重次,第二重
次,第三重
次
总复杂度为