1、 算法设计与分析实验报告矩阵连乘问题:给定 n 个矩阵 A1,A2,An,其中 Ai 与 Ai+1 是可乘的,i=1,2,3 ,n-1。考察这 n 个矩阵的连乘 A1,A2,An。实验基本思想:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。设计求解矩阵连乘问题的动态规划算法的第 1 步是刻画该问题的最优解的结构特征。为方便起见,将矩阵连乘积简记为 Ai:j。考察计算 A1:n的最优计算次序。设这个计算次序矩阵在 Ak 和 Ak+1 之间将矩阵链断开,,则其相应的完全加括号方式为(A1Ak)(Ak+1 An)。依此次序,先计算 A1:k和 Ak+1:n,然后将计算结果相乘得
2、到 A1:n。一 实验环境VC+6.0二 实验内容C 语言代码如下:#include using namespace std; const int L = 7; int MatrixChain(int n,int *m,int *s,int *p); void Traceback(int i,int j,int *s);/构造最优解 int main() int pL=28,17,15,30,10,30,28; /A1 为 28*17 A2 为 17*15 A3 为15*30 A4 为 30*10 A5 为 10*30 A6 为 30*28 int *s = new int *L; int *
3、m = new int *L; for(int i=0;iL;i+) si = new intL; mi = new intL; cout“矩阵最少的计算次数为:“MatrixChain(6,m,s,p)endl; cout“最优连乘顺序为:(两矩阵相乘后标号为前一个矩阵)“endl; Traceback(1,6,s); return 0; int MatrixChain(int n,int *m,int *s,int *p) for(int i=1; i=n; i+) mii = 0; for(int r=2; r=n; r+) for(int i=1; i=n-r+1; i+) int j
4、 = i+r-1; mij = mi+1j + pi-1*pi*pj;sij = i; for(int k=i+1; kj; k+) int t = mik + mk+1j + pi-1*pk*pj; if(tmij) mij = t; sij = k; return m1L-1; void Traceback(int i,int j,int *s) if(i=j) return; Traceback(i,sij,s); Traceback(sij+1,j,s); cout“相乘的矩阵为 A“i“,“sij; cout“ and A“(sij+1)“,“jendl; 三 实验总结通过本次实验,我大概了解了动态规划算法的几个基本步骤。完成实验后,我认为建立递归关系是动态规划里面很关键的一步,同时也是整个动态规划算法的精髓。运用递归的思想,就可以避免计算很多重复的计算。具体到这次的矩阵连乘问题,关键是解决断开点 k 的位置和最少数乘次数。