矩阵连乘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法设计与分析》实验报告
矩阵连乘问题:
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2,3…,n-1。考察这n个矩阵的连乘A1,A2,…,An。
实验基本思想:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。设计求解矩阵连乘问题的动态规划算法的第1步是刻画该问题的最优解的结构特征。为方便起见,将矩阵连乘积简记为A[i:j]。考察计算A[1:n]的最优计算次序。设这个计算次序矩阵在Ak和Ak+1之间将矩阵链断开,,则其相应的完全加括号方式为((A1…Ak)(Ak+1…An))。依此次序,先计算A[1:k]和A[k+1:n],然后将计算结果相乘得到A[1:n]。
一.实验环境
VC++6.0
二.实验内容
C语言代码如下:
#include
using namespace std;
constint L = 7;
intMatrixChain(intn,int **m,int **s,int *p);
void Traceback(inti,intj,int **s);//构造最优解
int main()
{
int p[L]={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 **m = new int *[L];
for(int i=0;i { s[i] = new int[L]; m[i] = new int[L]; } cout<<"矩阵最少的计算次数为:"< cout<<"最优连乘顺序为:(两矩阵相乘后标号为前一个矩阵)"< return 0; } intMatrixChain(intn,int **m,int **s,int *p) { for(int i=1; i<=n; i++) { m[i][i] = 0; } for(int r=2; r<=n; r++) { for(int i=1; i<=n-r+1; i++) { int j = i+r-1; m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j]; s[i][j] = i; for(int k=i+1; k { int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]; if(t { m[i][j] = t; s[i][j] = k; } } } } return m[1][L-1]; } voidTraceback(inti,intj,int **s) { if(i==j) return; Traceback(i,s[i][j],s); Traceback(s[i][j]+1,j,s); cout<<"相乘的矩阵为 A"< cout<<" and A"<<(s[i][j]+1)<<","< } 三.实验总结 通过本次实验,我大概了解了动态规划算法的几个基本步骤。完成实验后,我认为建立递归关系是动态规划里面很关键的一步,同时也是整个动态规划算法的精髓。运用递归的思想,就可以避免计算很多重复的计算。具体到这次的矩阵连乘问题,关键是解决断开点k的位置和最少数乘次数。