软件设计师 · 动态规划工具

矩阵连乘最优次序计算器

矩阵 A1 到 An 的顺序不能交换,但括号放在哪里,会让标量乘法次数相差很多。输入一串相邻维度,工具会用区间动态规划找出最优括号次序,并把每个子区间的最小代价列出来。

软考计算工具 软考题库编辑部 持续更新
在线计算

输入矩阵链维度

例如 30,35,15,5 表示 A1 为 30×35、A2 为 35×15、A3 为 15×5。

矩阵数量 -- 维度个数减1
最少标量乘法次数 -- 动态规划得到的全局最小代价
最优括号次序 -- 只改变结合顺序,不交换矩阵位置
最终结果矩阵 -- 首维度×末维度,与括号次序无关

输入的不是每个矩阵两组尺寸

若 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) 之间切开,总代价等于左半段最优代价、右半段最优代价,再加上两个中间结果相乘的代价。把所有切分点都试一遍,取最小值即可。

这里不能靠“每次先乘当前代价最小的一对”做贪心。一次局部看似便宜的合并,可能生成很大的中间矩阵,反而抬高后续全部运算。

区间状态m[i,j]:Ai…Aj 的最少标量乘法次数
边界m[i,i] = 0
状态转移m[i,j] = min{m[i,k] + m[k+1,j] + p(i-1)×pk×pj}

怎样读工具给出的代价表

主对角线代表单个矩阵,不需要乘法,所以都是 0。右上角的单元格逐步覆盖长度为2、3直到整条矩阵链的子问题,最右上角就是最终答案。

括号次序由每个区间取得最小值时的切分点反向还原。考试手算三四个矩阵时,可以直接列出所有括号方案;矩阵更多时,再按区间长度填表会更稳。

题干规模推荐做法检查重点
3个矩阵比较两种括号次序每步写出中间矩阵尺寸
4个矩阵列5种完整括号方案或填区间表不能漏掉左右子区间代价
更多矩阵区间动态规划记录最小代价和最优切分点

继续练一道矩阵连乘题

先独立算一遍,再用工具核对。若最终数字不一致,优先检查中间矩阵尺寸,而不是只重按一次乘法。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。

常见问题

矩阵连乘可以交换矩阵顺序吗?

不可以。矩阵乘法通常不满足交换律,矩阵链优化只调整括号位置,不能把 A1A2A3 改成 A2A1A3。

为什么输入 n+1 个维度会得到 n 个矩阵?

矩阵 Ai 的尺寸是 p(i-1)×pi,相邻矩阵共用一个维度。因此 p0,p1,…,pn 一共 n+1 个维度,正好描述 n 个可连续相乘的矩阵。

矩阵连乘为什么不能只用贪心算法?

局部乘法次数最少的合并不一定产生适合后续计算的中间尺寸。区间动态规划会比较每个子区间的全部切分点,才能保证得到全局最优代价。