矩阵连乘的备忘录算法 c语言,矩阵连乘备忘录算法.doc

矩阵连乘备忘录算法

湖南涉外经济学院 计算机科学与技术专业

《算法设计与分析》课程

矩阵连乘备忘录算法

实 验 报 告

班级:

学号:

姓名:

教师:

成绩:

2012年5月

【实验目的】1 掌握动态规划算法和

2 利用动态规划思想实现3 分析实验结果,总结算法的时间和空间复杂度。思考是否能将算法的时间复杂度提高到O(nlgn)

【系统环境】Windows 07 平台

【实验工具】VC++6.0中文企业版【】描述: …,An},其中Ai与Ai+1可乘的,i=1,2,…,n-1。找出这个n个矩阵的连乘A1A2…An所需相乘的最少次数的方式。

例:

【实验原理】LookupChain时,若m[i][j]>0,则表示其中储存的是所要求子问题的计算结果,直接返回此结果即刻。否则与直接递归算法一样,自顶而下的递归计算,并将计算结果存入m[i][j]后返回。因此,LookupChain总能返回正确的值,但仅在它第一次被调用时计算,以后调用就直接返回计算结果。

方法:用MemorizedMatrixChain函数将已经计算的数据存入表中,用LookupChain函数配合MemorizedMatrixChain函数递归调用计算。

【】#include

#include

#include

#define N 10

int p[N],m[N][N],s[N][N];

int LookupChain(int i,int j);

//备忘录算法函数

int MemorizedMatrixChain(int n,int **m,int **s)

{

for(int i=1;i<=n;i++)

for(int j=i;j<=n;j++)

m[i][j]=0;

return LookupChain(1,n);

}

//递归调用函数

int LookupChain(int i,int j)

{

if(m[i][j]>0)

return m[i][j];

if(i==j)

return 0;

int u=LookupChain(i,i)+LookupChain(i+1,j)+p[i-1]*p[i]*p[j];

s[i][j]=i;

for(int k=i+1;k

{

int t=LookupChain(i,k)+LookupChain(k+1,j)+p[i-1]*p[k]*p[j];

if(t

{

u=t;

s[i][j]=k;

}

}

m[i][j]=u;

return u;

}

//输出格式函数

void Print(int s[][N],int i,int j)

{

if(i==j)

{

printf("A");

printf("%d",i);

}

else

{

printf("(");

Print(s,i,s[i][j]);

Print(s,s[i][j]+1,j);

printf(")");

}

}

//主函数

int main()

{

srand(time(NULL));

for(int i=0;i

p[i]=rand()%100;//随机生成;

for(i=0;i

printf("%4d",p[i]);

printf("\n");

int result=LookupChain(1,N-1);

printf("最少次数:\n");

printf("%d\n\n\n",result);

printf("最优次序:\n");

Print(s,1,N-1);

printf("\n");

return 0;

}【实验结果】运行结果图

【】MemorizedMatrixChain耗时O(n^3)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值