[问题]给定一个包含n个矩阵的链乘式,通过对矩阵加括号来变换矩阵相乘的次序。问应当怎样加括号才能使求解过程中乘法运算的总次数最少?最少的总次数是多少?
[解析]假设矩阵链乘式A1A2A3A4A5的最优解为((A1)(A2A3))(A4A5) ,则(A1)(A2A3)必为链乘式A1A2A3的最优解(由反证法易得)。由此可知,该问题具有最优子结构性质。递推式如下;
设链乘式AiAi+1Ai+2……Aj中矩阵An的列数为Columns[n],其划分的形式为
(Ai……Ak)(Ak+1……Aj),则相应的乘法运算的总次数为,对左括号进行计算求得矩阵ALeft的过程中的最少总次数f(i)(k),加上对右括号进行计算求得矩阵ARight的过程中的最少总次数f(k+1)(j),再加上Columns[i-1] × Columns[k]的矩阵ALeft与Columns[k] × Columns[j]的矩阵ARight 相乘时乘法运算的总次数Columns[i-1] * Columns[k] * Columns[j]。所以链乘式AiAi+1Ai+2……Aj的最优解的值f(i)(j)就是k的取值从i一直取到j的过程中所得的最小的总次数,即
f(i)(j) = Min{f(i)(k) + f(k+1)(j) + Columns[i-1] * Columns[k] * Columns[j]},i≤k<j