1.问题
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
2.解析
假设在第k位置上找到最优解,那么问题就变成两个子问题:(Ai,Ai+1……Ak),(Ak+1……Aj);
用dp[i][j]表示矩阵连乘的最优值,那么两个子问题对应的最优值变成dp[i][k],dp[k+1][j];
设矩阵A的行数为P,列数为Q,矩阵是可连乘的,即相邻矩阵Q=P+1,所以(Ai,Ai+1……Ak)可表示为Pi * Qk;
(Ak+1……Aj)可表示为Pk+1 * Qj,Qk = Pk+1.则两个矩阵连乘的乘法次数为Pi * Pk+1 * Qj。
//动态规划部分
for (int t = 1; t < n; t++) {
//限定了矩阵链的总规模,限定步长。
for (i = 1; i <= n - t; i++) {
j = i + t;
for (k = i; k <= j - 1; k++) {
if ((dp[i][k] + dp[k + 1][j] + mx[i] * mx[k + 1] * mx[j + 1]) < 最小值) {
最小值= dp[i][k] + dp[k + 1][j]