如果看过我上一篇文章(动态规划——最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用。
本章要讲解的问题是矩阵链相乘。因为要照顾一些小白同学和方便撰写文章,我会写得比较详细,如果有基础、想看ac代码的同学可直接跳到后面的代码段。矩阵链相乘,顾名思义就是多个矩阵相乘,那为什么同样的矩阵相乘得出来的乘法次数会不一样呢?下面来看一个例子。
三个二维矩阵M1、M2、M3,分别是2*10,10*2,2*10。如果(M1*M2)*M3,那么要进行的乘法次数是2*10*2+2*2*10=80;如果M1*(M2*M3),那么要进行的乘法次数是10*2*10+2*10*10=400(看不懂乘法次数算式的同学可以先去复习一下线性代数的知识)。所以,矩阵链相乘的相乘次数会根据矩阵间的不同相乘顺序而有所不同。看懂原理之后,那我们来做一个题。
矩阵链乘 (转自PTA)
用动态规划法确定n个矩阵链乘M1M2...Mn运算量最小(即数量乘法次数最少)的计算次序.。
输入格式:
输入的第一行包含一个整数n(1≤n≤20),接下来一行是n+1个数依次是n个矩阵的行数以及最后一个矩阵的列数。注意,根据矩阵乘法定义,两个矩阵相乘MiMi+1意味着后一矩阵Mi+1的行数与前一矩阵Mi的列数相同。
输出格式:
在一行内输出这n个矩阵链乘时数量乘法的最少次数,以及一种对应的最优计算次序。最优计算次序采用对M1M2...Mn加括号的形式输出,一共n−1对括号(参见输出样例)。
如果有多种最优计算次序,则取每层括号尽量靠前的那种次序(即每层括号划分的两个矩阵子序列中前面子序列尽可能短的那种)。例如,如果M1M2M3M4M5的最优计算次序的最外层括号有两种方式:(M1M2M3)(M4M5)和(M1M2)(M3M4M5), 则最外层括号取后一种,因为其括号更靠前。

本文介绍了如何使用动态规划求解矩阵链相乘的最小乘法次数,并给出了详细的解题思路和AC代码。通过动态规划存储子问题结果,避免重复计算,实现效率优化。同时,文章还提供了矩阵链相乘的最优计算次序的输出方法。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



