动态规划算法分析与设计实验报告(矩阵连乘)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计实验报告
实验题目:动态规划算法的设计与实现
1、实验目的
通过本实验,掌握动态规划算法的设计的基本思想,进一步提高学生的编程能力。
2、实验内容:
给定n个矩阵{A1,A2,…,A n},其中A i与A i+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
3、源程序
if (t
{ u=t; s[i][j]=k;
} }
return u; }
int Look(int i,int j) //备忘录计算最优值
{ if (m[i][j]>0)
{ return m[i][j]; }
if (i == j) return 0;
int u=Look(i, i)+Look(i+1,j)+p[i-1]*p[i]*p[j]; s[i][j]=i;
for (int k=i+1; k { int t=Look(i,k)+Look(k+1,j)+p[i-1]*p[k]*p[j]; //递归 if (t { u=t; //从k处断开,分别求得每次的数乘次数s[i][j]=k; //返回t,k中较小的值,并记录断点处k } } m[i][j]=u; return u; } void Traceback(int i,int j) { //输出矩阵结合方式,加括号输出 if(i == j) //只有一个矩阵,直接输出 { cout<<"A"< else if(i+1 == j) //两个矩阵,加括号输出 { cout<<"(A"< else { cout<<"("; Traceback(i,s[i][j]); //递归,从最得到最优解的地方s[i][j]处断开Traceback(s[i][j]+1,j); cout<<")"; } } void main() { cout<<"输入矩阵个数:n="; cin>>n; cout<<"输入第一个矩阵行数和第一个到第n个矩阵的列数:"; for(int i=0;i<=n;i++) { cin>>p[i]; } cout< cout<<"0.退出..."< cout< cout<<"请选择算法:"; cin>>q; cout< while(q!=0){ switch(q){ case 1: matrixChain(); cout<<"动态规划算法解决矩阵连乘问题:"< Traceback(1,n); cout< "< break; case 2: Recur(0,n); cout<<"直接递归算法解决矩阵连乘问题:"< 5、结论 动态规划算法设计通常有四个步骤: 1.找出最优解的性质,并刻画其结构特征。 2.递归的定义最优解 3.自底向上的方式计算出最优值。 4.根据计算最优值时得到的信息,构造最优解。