问题描述:
给定一个矩阵求解问题,矩阵
的维度为
如何通过改变矩阵乘法的求解顺序来提高计算效率
动态规划求解步骤
Step 1: 分析最优解的性质,刻画其结构特征
Step 2: 递归地定义最优解
Step 3: 自底向上计算子问题的最优解
Step 4: 构造问题的最优解
伪代码解析
MatrixChain(p, n)
输入: n为矩阵链乘积的元素个数,p为矩阵链中每个矩阵的维度,长度为n+1
步骤1,构建两个二维数组m[n,n]记录矩阵链Aij的最优复杂度,s[n,n]记录分割位置
Let 𝑚[1. . 𝑛, 1. . 𝑛] and 𝑠[1. . 𝑛, 1. . 𝑛] be two 2-dimension arrays:
步骤2:初始化二维数组m,使其对角线上的元素值为0,即A11的计算复杂度为0
for 𝑖 ← 1 𝑡𝑜 𝑛 do
𝑚 [𝑖, 𝑖]← 0;
end
步骤3:通过三层循环遍历,第一层遍历用来求解矩阵链长度为l的复杂度
第二层遍历用来计算矩阵链长度为l时所有可能组合的组合的最优计算复杂度
第三层遍历用来求解所有可能分割方式取得到的最优解
for 𝑙 ← 2 𝑡𝑜 𝑛 do
for 𝑖 ← 1 𝑡𝑜 𝑛 − 𝑙 + 1 do
𝑗 ← 𝑖 + 𝑙 − 1;
𝑚 [𝑖, 𝑗] ← ∞;
for 𝑘 ← 𝑖 𝑡𝑜 𝑗 − 1 do
𝑞 ← 𝑚 [𝑖, 𝑘] + 𝑚 [𝑘 + 1, 𝑗 ]+ 𝑝 [𝑖 − 1] ∗ 𝑝 [𝑘] ∗ 𝑝[ 𝑗 ];
if 𝑞 < 𝑚[𝑖, 𝑗] then
𝑚 [𝑖, 𝑗] ← 𝑞;
𝑠 [𝑖, 𝑗] ← 𝑘;
end
end
end
end
return 𝑚 [1, 𝑛] 𝑎𝑛𝑑 𝑠;
图示