输入矩阵链维度
例如 30,35,15,5 表示 A1 为 30×35、A2 为 35×15、A3 为 15×5。
输入的不是每个矩阵两组尺寸
若 A1 为 10×30、A2 为 30×5、A3 为 5×60,只需输入 10,30,5,60。相邻矩阵共用中间维度,工具会自动还原为三个矩阵。这样也能在输入阶段避免写出无法相乘的矩阵链。
矩阵乘法满足结合律,所以 (A1A2)A3 与 A1(A2A3) 的结果相同;它通常不满足交换律,因此不能为了省计算把 A1、A2、A3 调换位置。
三矩阵示例
输入 10,30,5,60,代表 10×30、30×5、5×60。
先算 A1A2:1500 次,再乘 A3:3000 次,合计 4500 次。
先算 A2A3:9000 次,再乘 A1:18000 次,合计 27000 次。
动态规划为什么能找到全局最优
设 m[i,j] 是从 Ai 连乘到 Aj 的最少标量乘法次数。若最后一次乘法在 Ak 与 A(k+1) 之间切开,总代价等于左半段最优代价、右半段最优代价,再加上两个中间结果相乘的代价。把所有切分点都试一遍,取最小值即可。
这里不能靠“每次先乘当前代价最小的一对”做贪心。一次局部看似便宜的合并,可能生成很大的中间矩阵,反而抬高后续全部运算。
怎样读工具给出的代价表
主对角线代表单个矩阵,不需要乘法,所以都是 0。右上角的单元格逐步覆盖长度为2、3直到整条矩阵链的子问题,最右上角就是最终答案。
括号次序由每个区间取得最小值时的切分点反向还原。考试手算三四个矩阵时,可以直接列出所有括号方案;矩阵更多时,再按区间长度填表会更稳。
| 题干规模 | 推荐做法 | 检查重点 |
|---|---|---|
| 3个矩阵 | 比较两种括号次序 | 每步写出中间矩阵尺寸 |
| 4个矩阵 | 列5种完整括号方案或填区间表 | 不能漏掉左右子区间代价 |
| 更多矩阵 | 区间动态规划 | 记录最小代价和最优切分点 |
继续练一道矩阵连乘题
先独立算一遍,再用工具核对。若最终数字不一致,优先检查中间矩阵尺寸,而不是只重按一次乘法。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- A为10×30、B为30×5、C为5×60时,怎样加括号乘法次数最少?矩阵连乘 / 动态规划
常见问题
矩阵连乘可以交换矩阵顺序吗?
不可以。矩阵乘法通常不满足交换律,矩阵链优化只调整括号位置,不能把 A1A2A3 改成 A2A1A3。
为什么输入 n+1 个维度会得到 n 个矩阵?
矩阵 Ai 的尺寸是 p(i-1)×pi,相邻矩阵共用一个维度。因此 p0,p1,…,pn 一共 n+1 个维度,正好描述 n 个可连续相乘的矩阵。
矩阵连乘为什么不能只用贪心算法?
局部乘法次数最少的合并不一定产生适合后续计算的中间尺寸。区间动态规划会比较每个子区间的全部切分点,才能保证得到全局最优代价。