算法实验动态规划矩阵连乘.docx
- 文档编号:5297046
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:6
- 大小:40.12KB
算法实验动态规划矩阵连乘.docx
《算法实验动态规划矩阵连乘.docx》由会员分享,可在线阅读,更多相关《算法实验动态规划矩阵连乘.docx(6页珍藏版)》请在冰豆网上搜索。
算法实验动态规划矩阵连乘
实验三:
动态规划法
【实验目的】
深入理解动态规划算法的算法思想,应用动态规划算法解决实际的算法问题。
【实验性质】
验证性实验。
【实验要求】
对于下列所描述的问题,给出相应的算法描述,并完成程序实现与时间复杂度的分析。
该问题描述为:
一般地,考虑矩阵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。
完成测试。
【算法思想及处理过程】
Main()函数:
定义二维数组m用来存放最优解;定义二维数组s用来存放最优解的断开点;定义一维数组p用来存放矩阵维数.
MatrixChain函数:
首先通过for循环,给二维数组M和S的对角线赋值为0(表示只有一个矩阵,没有相乘的).然后通过for循环,求出最优解(这只是假定的最优解)和断开点(这只是假定的最完美的断开点),再通过双重for循环在后面找到了一个最优解,判断后一个最优解是不是比前一个最优解小(也就是更优,更好),如果小,则将前最优解改为后一个的最优解,并且将前断开点改为后一个的断开点,然后重复此操作.
【程序代码】
#include
voidMatrixChain(intp[],intm[][6],ints[][6],intn);//求最优解和断开点
voidprint1(intm[][6],ints[][6],intp[]);//打印矩阵,最优解,断开点
voidprint2(inti,intn,ints[][6]);//打印加括号的断开矩阵
intmain()
{
intp[7]={10,20,25,15,5,10,25};
intm[6][6],s[6][6];
MatrixChain(p,m,s,6);
print1(m,s,p);
printf("\n\n矩阵连乘次数的最优值为:
\n");
printf("-----------------------------------------------\n");
print2(0,6-1,s);
printf("\n-----------------------------------------------\n\n");
return0;
}
voidMatrixChain(intp[],intm[][6],ints[][6],intn)
{
inti,j,k,z,t;
for(i=0;i { m[i][i]=0; s[i][i]=0; } for(z=2;z<=n;z++) for(i=0;i<=n-z;i++) { j=i+z-1; m[i][j]=m[i+1][j]+p[i]*p[i+1]*p[j+1]; s[i][j]=i; for(k=i+1;k { 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; } } } } voidprint1(intm[][6],ints[][6],intp[]) { inti,j; printf("\n\n程序所给矩阵如下: \n"); printf("-----------------------------------------------\n"); for(i=0;i<6;i++) printf("A%d矩阵: %2dX%-2d\n",i+1,p[i],p[i+1]); printf("\n\n-----------------------------------------------\n"); printf("矩阵的最少计算次数为: %d\n",m[0][5]); printf("-----------------------------------------------\n"); printf("\n\n数乘次数: \n"); printf("-----------------------------------------------\n"); for(i=0;i<6;i++) { for(j=0;j printf(""); for(j=i;j<6;j++) printf("%-7d",m[i][j]); printf("\n"); } printf("-----------------------------------------------\n"); printf("\n\n中间断点: \n"); printf("-----------------------------------------------\n"); for(i=0;i<6;i++) { for(j=0;j printf(""); for(j=i;j<6;j++) printf("%-7d",s[i][j]); printf("\n"); } printf("-----------------------------------------------\n"); } voidprint2(inti,intn,ints[][6]) { if(i==n) printf("A%d",i); elseif(i+1==n) printf("(A%dA%d)",i,n); else{ printf("("); print2(i,s[i][n],s); print2(s[i][n]+1,n,s); printf(")"); } } 【运行结果】 【算法分析】 函数MatrixChain()包含三重循环,循环体内的计算量为O (1),所以算法的时间复杂度为O(n3),算法的空间时间复杂度为O(n3). 【实验总结】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 实验 动态 规划 矩阵