1、系别班级:信控系智能 0702 班姓名:刘保卫 学号(序号):06074053(18)实验二 矩阵连乘(动态规划)1算法要求给定 n 个矩阵A1,A2,An ,其中 Ai 与 Ai+1 是可乘的, i=1,2 ,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。2算法设计 将矩阵连乘积简记为 Ai:j ,这里 ij 考察计算 Ai:j的最优计算次序。设这个计算次序在矩阵 Ak 和 Ak+1 之间将矩阵链断开,ikj,则其相应完全加括号方式为计算量:Ai:k的计算量加上 Ak+1:j的计算量,再加上 Ai:k和 Ak+1:j相乘的计算量设计算 Ai:j,1i
2、jn,所需要的最少数乘次数 mi,j,则原问题的最优值为 m1,n 当 i=j 时,Ai:j=Ai ,因此,mi,i=0,i=1,2,n当 ij 时,可以递归地定义 mi,j为:k 位置只有 j-i 种可能3程序设计#include “stdio.h“void matrixChain( int m77, int s77);void main()int i,j;int p7,m77,s77;for(i=1;i=6;i+)for(j=1;j=6;j+)mij=0;sij=0;).)(.(211jkki AAjkipjkmiji 1, jipjkiji jki,n0, 1jkiprintf(“矩阵的
3、下标为:n“);for(i=0;i7;i+)scanf(“%d“,matrixChain(p,m,s);printf(“The best sequence:n“);for(i=1;i=6;i+)for(j=1;j=6;j+)printf(“%8d“,mij);printf(“n“);printf(“n“);for(i=1;i=6;i+)for(j=1;j=6;j+)printf(“%8d“,sij);printf(“n“);void matrixChain(int p7, int m77, int s77)int n=6,i,j,r,k,t;for ( i = 1; i = n; i+) mi
4、i = 0;for ( r = 2; r = n; r+)for ( i = 1; i = n - r+1; i+)j=i+r-1;mij = mi+1j+ pi-1*pi*pj;sij = i;for ( k = i+1; k j; k+)t = mik + mk+1j + pi-1*pk*pj;if (t mij)mij = t;sij = k;4程序结果连乘矩阵如下:A1 A2 A3 A4 A5 A63035 3515 155 510 1020 2025输出 mij和 sij则计算 m25取最优解,即计算 A2:5所需的最少数乘次数,并确定A2:5的最优次序中的断开位置 k。=7125且
5、 k=3,因此 s25=3. 137520350475421263min52513p5.算法评价因为在计算矩阵连乘积时,计算次序对计算量有很大影响,故一方面分析最优解的结构:1)特征:计算 Ai:j的最优次序所包含的计算矩阵子链 Ai:k和 Ak+1:j的次序也是最优的。2)矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法求解的显著特征。因此,采用递归关系求最优解 mij,从而减少了计算量另一方面,在递归计算时,许多子问题被重复计算多次。这也是该问题可用动态规划算法求解的又一显著特征。用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。算法复杂度分析:算法 matrixChain 的主要计算量取决于算法中对 r,i 和 k 的 3 重循环。循环体内的计算量为 O(1),而 3 重循环的总次数为 O(n3)。因此算法的计算时间上界为 O(n3)。算法所占用的空间显然为 O(n2)。