给定一个矩阵序列M1M2...Mn,计算乘积M1M2...Mn。要求找出一个放置括号的方式,使得标量乘法的次数最小。
蛮力方法:
1. 列举所有加括号的方法:
将矩阵分为两部分。
如果前k个矩阵有f(k)种方法,n-k个矩阵有f(n-k)种方法,则有下面的递推式。
对前几种情况,f(1)=1,f(2)=1,f(3)=2。
我们可以继续推出下面的式子:
由此产生卡特兰数(Catalan):
可以算出:
2. 总的时间:
每个表达式次数的计算耗费Θ(n),总的时间是:
耗费是非常大的。
动态规划解法:
利用动态规划解决该问题,可以在Θ(n3)的时间和Θ(n2)的空间内找出答案。
基本思路:
对于矩阵链,我们只对各个矩阵的行数和列数感兴趣,于是,矩阵链可以简化成一个长度为n+1的一维数组r1r2...rn+1,前n个数表示矩阵的行数,第n+1个数表示矩阵n的列数。
对于矩阵Mi...Mj的乘法次数的计算,我们可以分成两部分Mi...Mk-1和Mk...Mj,它的耗费是前一个矩阵的耗费加上后一个矩阵的耗费,再加上前后两个矩阵相乘的耗费rirkrj+1。
于是有下面的递推式:
于是对矩阵序列M1M2...Mn的乘法,我们可以通过下面的递推式求解出最小次数:
这就是状态转移方程了。
然后是初始化条件:C[i,i]=0。
看下面的图示:
动态规划的过程就是从左下角推到右上角的过程。
伪代码: