矩阵连乘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实
验
报
告
学生姓名:王若兰
学号:2013060103029
指导教师:曹晟
日期: 2014 年12 月 6日
一、实验室名称:
主楼A2-412 二、实验项目名称:
用动态规划解决矩阵连乘问题
三、实验原理:
矩阵的结合律:ABC=(AB)C=A(BC) ;
设m
ij
为i到j矩阵的最小乘法次数,则:
当i=j时,m
ij =0;当i ij = j k i≤ ≤ min {m k i,+m j k), 1 (++r i r 1+ k r 1+j },令k在i<=k<=j 之间取尽所有值,使得m k i,和m j k), 1 (+最小,进而使得 m ij 最小。 四、实验目的: 通过动态规划的方法实现矩阵连乘最小用算代价。 五、实验内容: 六、实验器材(设备、元器件): 联想台式计算机R412-LX046. Windows XP 2002版、Microsoft VC++6.0 七、实验步骤: 1、分析问题:了解矩阵连乘的算术方法和乘积顺序; 2、比较穷举法和动态规划的差异及时间复杂度的大小; 3、将问题转化为算法,并将算法以程序形式表示出; 4、运行并改进程序,记录数据并总结。 八、实验数据及结果分析: #include #include #define N 6 void main() { long int p[N],m[N][N],s[N][N]; long int i,j,l,k; for(i=0;i scanf("%d",&p[i]); for(i=1;i { m[i][j]=0; s[i][i]=0; } for (l=2;l<=7;l++) for (i=1;i<=N-l;i++) { j=i+l-1; m[i][j]=32765; for(k=i;k { if(m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j] { m[i][j]=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; s[i][j]=k; } } } for(i=1;i<=N;i++) { for(j=i;j<=N;j++) printf("%5d",m[i][j]); printf("\n"); } for(i=1;i<=N;i++) { for(j=i;j<=N;j++) printf("%5d",s[i][j]); printf("\n"); } } 九、实验结论: 求矩阵乘积最小运算代价的算法体现了动态规划方法的优点:在选解时将k 限制在i<=k<=j的范围内,并且令差值j-i自小而大递增,即先解小的子问题并把解保存起来,然后利用小问题的解来求大的子问题,最后形成整个问题的解。 十、总结及心得体会: 十一、对本实验过程及方法、手段的改进建议 报告评分: