算法设计实验3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:动态规划法
【实验目的】
应用动态规划算法思想求解矩阵连乘的顺序问题。
【实验要求】
应用动态规划算法的最优子结构性质和子问题重叠性质求解此问题。分析动态规划算法的基本思想,应用动态规划策略写出算法及相应的程序,求解此题。要读懂读透A[i,j],
A[1,n]=A[1,k] ×A[k+1,n],m[i][j],s[i][j]各式所表达的含义并正确加以应用。m[i][j]的递归定义:
0 (i=j )
m[i][j]=
min{m[i][k]+m[k+1][j]+n i-1n k n j (i 【实验性质】 验证性实验。 【实验内容】 对于下列所描述的问题,给出相应的算法描述,并完成程序实现与时间复杂度的分析。该问题描述为:一般地,考虑矩阵A1,A2,…,An的连乘积,它们的维数分别为d0,d1,…,dn,即Ai的维数为di-1×di (1≤i≤n)。确定这n个矩阵的乘积结合次序,使所需的总乘法次数最少。对应于乘法次数最少的乘积结合次序为这n个矩阵的最优连乘积次序。按给定的一 组测试数据对根据算法设计的程序进行调试:6个矩阵连乘积A=A1×A2×A3×A4×A5×A6,各矩阵的维数分别为:A1:10×20,A2:20×25,A3:25×15,A4:15×5,A5:5×10,A6:10×25。完成测试。 【注意事项】 用C语言或C++实现算法。选择合适的数据结构。注意:是求解完成矩阵连乘的乘法运算次数最少的矩阵连乘次序,而不是求解矩阵连乘的结果。 【调试分析和心得体会】 运行依算法写出的程序并分析算法实现的时间复杂度情况。 #include #include class MatrixChain { public: MatrixChain(int mSize); //创建二维数组m和s,一维数组p,并初始化int MChain(); //一般动态规划法求最优解值 int LookupChain(); //备忘录方法求最优解值(程序7-4) void Traceback(); //构造最优解的公有函数 private: void Traceback(int i, int j); //构造最优解的私有递归函数 int LookupChain(int i, int j); //备忘录方法私有递归(程序7-4)int *p, **m, **s, n; }; int MatrixChain::MChain() { //求A[0:n-1]的最优解值 for (int i=0;i for (int r=2; r<=n; r++) for (int i=0; i<=n-r; i++) { int j=i+r-1; m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]; //m[i][j] 的初值 s[i][j]=i; for (int k=i+1; k int t=m[i][k]+m[k+1][j]+p[i]*p[k+1]*p[j+1]; if (t m[i][j]=t; s[i][j]=k; } } } return m[0][n-1]; } void MatrixChain::Traceback(int i, int j) if(i==j) { cout<<'A'< if (i if(s[i][j]+1 void MatrixChain::Traceback() { cout<<'('; Traceback(0, n-1); cout<<')'; cout< } MatrixChain::MatrixChain(int mSize) { n=mSize; p= new int [n+1]; m= new int *[n]; s=new int *[n]; for(int i=0;i cout<<"输入矩阵行列值:"< for(i=0;i {cin>>p[i];} void main(void) { int n; cout<<"输入矩阵个数:"; cin>>n; MatrixChain g(n); g.MChain(); g.Traceback(); } 答案: 输入矩阵个数:6 输入矩阵行列值: 10×20 20×25 25×15 15×5 5×10 10×25 (((A0A1)A2)(A3(A4A5))) Press any key to continue