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

上传人:b****1 文档编号:146973 上传时间:2022-10-04 格式:DOCX 页数:3 大小:37.58KB
下载 相关 举报
动态规划算法分析与设计实验报告(矩阵连乘).docx_第1页
第1页 / 共3页
动态规划算法分析与设计实验报告(矩阵连乘).docx_第2页
第2页 / 共3页
动态规划算法分析与设计实验报告(矩阵连乘).docx_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《动态规划算法分析与设计实验报告(矩阵连乘).docx》由会员分享,可在线阅读,更多相关《动态规划算法分析与设计实验报告(矩阵连乘).docx(3页珍藏版)》请在冰豆网上搜索。

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

西南大学荣昌校区信息管理系

算法分析与设计实验报告

实验题目:

动态规划算法的设计与实现

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(temp

m[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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1