题目描述
给定 个矩阵,已知第 个矩阵 的大小为 行 列,而我们并不关心其内容。我们考虑将其按照顺序相乘(称其为链乘积):
矩阵乘法并不满足交换律,但是其满足结合律,因此我们可以通过合理安排结合顺序,尽可能减少需要的运算次数。在此题中,我们定义将一个大小为 的矩阵乘以一个大小为 的矩阵需要 次运算。
请你算出将题目所给的 个矩阵进行链乘积所需的最少运算数。为了方便起见,你不需要构造方案。
输入格式
输入的第一行为一个正整数 ,代表矩阵的数量。
接下来的一行包含 个正整数,其中第 个整数为 ,含义参考题目描述。
输出格式
输出包含一个整数,代表最小运算次数。
输入输出样例 #1
输入 #1
输出 #1
说明/提示
样例解释:样例告诉我们有 个矩阵,其大小分别是 , 和 。分别考虑两种乘法顺序:
- 先将 和 相乘得到一个 的矩阵,然后和 相乘,此时运算次数为 ;
- 先将 和 相乘得到一个 的矩阵,然后和 相乘,此时运算次数为 。
本题要求运算次数最少,因此答案为 。
对所有的数据,,。其中:
- 对 的数据,满足 ;
- 对另外 的数据,满足 。
题解
状态定义和转移
定义 表示从 到 所有矩阵相乘的最小代价。显然,
该算法复杂度为 。
DP 优化
查了各种资料发现本题 正解是 Hu-Sing 算法,贴个论文解读:[论文解析] Hu-Shing 算法 - 快速求出矩阵链乘积最优解 - 洛谷专栏。