算法分析与设计实验报告
实验题目:动态规划算法的设计与实现
1、实验目的
通过本实验,掌握动态规划算法的设计的基本思想,进一步提高学生的编程能力。
2、实验内容:
给定n个矩阵{A1,A2,…,A n},其中A i与A i+1是可乘的,i=1,2…,n-1。
如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
3、源程序
if (t<u) //返回t,k中较小的值,并记录断点处k
{ 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<j;k++)
{ int t=Look(i,k)+Look(k+1,j)+p[i-1]*p[k]*p[j]; //递归
if (t<u)
{ 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"<<i; }
else if(i+1 == j) //两个矩阵,加括号输出
{ cout<<"(A"<<i<<"A"<<j<<")"; }
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<<endl; cout<<"请选择解决矩阵连乘问题的方法:"<<endl; cout<<"1.动态规划算法"<<endl; cout<<"2.直接递归算法"<<endl; cout<<"3.备忘录算法"<<endl;
cout<<"0.退出..."<<endl;
cout<<endl;
cout<<"请选择算法:";
cin>>q; cout<<endl;
while(q!=0){ switch(q){
case 1: matrixChain(); cout<<"动态规划算法解决矩阵连乘问题:"<<endl; cout<<"最优计算次序为:";
Traceback(1,n); cout<<endl; cout<<"矩阵连乘的最优数乘次数为:
"<<m[1][n]<<endl; //最终解值为m[1][n]
break;
case 2: Recur(0,n); cout<<"直接递归算法解决矩阵连乘问题:"<<endl;
5、结论
动态规划算法设计通常有四个步骤:
1.找出最优解的性质,并刻画其结构特征。
2.递归的定义最优解
3.自底向上的方式计算出最优值。
4.根据计算最优值时得到的信息,构造最优解。