动态规划算法分析与设计实验报告(矩阵连乘)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.根据计算最优值时得到的信息,构造最优解。

相关文档
最新文档