动态规划算法分析与设计实验报告(矩阵连乘).docx
《动态规划算法分析与设计实验报告(矩阵连乘).docx》由会员分享,可在线阅读,更多相关《动态规划算法分析与设计实验报告(矩阵连乘).docx(3页珍藏版)》请在冰豆网上搜索。
![动态规划算法分析与设计实验报告(矩阵连乘).docx](https://file1.bdocx.com/fileroot1/2022-10/4/06d6e248-ae1c-4b2f-aaf3-0eb384f4ba90/06d6e248-ae1c-4b2f-aaf3-0eb384f4ba901.gif)
西南大学荣昌校区信息管理系
算法分析与设计实验报告
实验题目:
动态规划算法的设计与实现
1、实验目的
通过本实验,掌握动态规划算法的设计的基本思想,进一步提高学生的编程能力。
2、实验内容:
给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。
如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
3、源程序
#include
usingnamespacestd;
#defineN100
intn,q;
intm[N][N],s[N][N],p[N+1];
voidmatrixChain(){//动态规划计算最优值算法
for(inti=1;i<=n;i++){m[i][i]=0;}
for(intr=2;r<=n;r++){//对角线循环
for(inti=1;i<=n-r+1;i++){//行循环
intj=r+i-1;//列的控制,找m[i][j]的最小值,先初始化一下,令k=i
m[i][j]=m[i][i]+m[i+1][j]+p[i-1]*p[i]*p[j];s[i][j]=i;//k从i+1到j-1循环找m[i][j]的最小值
for(intk=i+1;k{
inttemp=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(tempm[i][j]=temp;//s[][]用来记录在子序列i-j段中,在k位置处断开能得到最优解
s[i][j]=k;}
}}}
}intRecur(inti,intj)//直接递归计算最优值
{if(i==j){return0;}
intu=Recur(i,i)+Recur(i+1,j)+p[i-1]*p[i]*p[j];//递归
s[i][j]=i;
for(intk=i+1;k{intt=Recur(i,k)+Recur(k+1,j)+p[i-1]*p[k]*p[j];
//从k处断开,分别求得每次的数乘次数
if(t
{u=t;s[i][j]=k;
}}
returnu;}
intLook(inti,intj)//备忘录计算最优值
{if(m[i][j]>0)
{returnm[i][j];}
if(i==j)return0;
intu=Look(i,i)+Look(i+1,j)+p[i-1]*p[i]*p[j];s[i][j]=i;
for(intk=i+1;k{intt=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;
returnu;}
voidTraceback(inti,intj){//输出矩阵结合方式,加括号输出
if(i==j)//只有一个矩阵,直接输出
{cout<<"A"<
elseif(i+1==j)//两个矩阵,加括号输出
{cout<<"(A"<
else
{cout<<"(";Traceback(i,s[i][j]);//递归,从最得到最优解的地方s[i][j]处断开Traceback(s[i][j]+1,j);
cout<<")";}}
voidmain()
{cout<<"输入矩阵个数:
n=";
cin>>n;cout<<"输入第一个矩阵行数和第一个到第n个矩阵的列数:
";for(inti=0;i<=n;i++)
{cin>>p[i];}cout<"<cout<<"0.退出..."<cout<cout<<"请选择算法:
";
cin>>q;cout<while(q!
=0){switch(q){
case1:
matrixChain();cout<<"动态规划算法解决矩阵连乘问题:
"<";
Traceback(1,n);cout<"<break;
case2:
Recur(0,n);cout<<"直接递归算法解决矩阵连乘问题:
"<";
Traceback(1,n);
cout<"<break;
case3:
Look(1,n);cout<<"备忘录算法解决矩阵连乘问题:
"<";
Traceback(1,n);
cout<"<break;
case0:
q=0;break;}
cout<"<cout<<"0.退出..."<cout<<"请选择算法:
";
cin>>q;
cout<cout<4、运行结果(截图)
5、结论
动态规划算法设计通常有四个步骤:
1.找出最优解的性质,并刻画其结构特征。
2.递归的定义最优解
3.自底向上的方式计算出最优值。
4.根据计算最优值时得到的信息,构造最优解。
3