算法分析与设计-07-计算矩阵连乘积的备忘录算法

本文介绍了一种使用备忘录技术优化的矩阵连乘算法,并提供了详细的C++实现代码。该算法能够有效地减少重复计算,求得矩阵连乘所需的最小乘法次数及其最优计算次序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算矩阵连乘积的备忘录算法

#include <stdio.h>
#include <iostream>
#define NUM 51
int n;
int p[NUM];
int m[NUM][NUM];
int s[NUM][NUM];
//备忘录算法
int LookupChain(int i,int j)
{
         if(m[i][j]>0)
                   returnm[i][j];
         if(i==j)
                   return0;
         intu=LookupChain(i,i)+LookupChain(i+1,j)+p[i-1]*p[i]*p[j];
         s[i][j]=i;
         for(intk=i+1;k<j;k++)
    {
       int t=LookupChain(i,k)+LookupChain(k+1,j)+p[i-1]*p[k]*p[j];
       if(t<u)
       {
           u=t;
           s[i][j]=k;
       }
    }
   m[i][j]=u;
   return u;
 
}
//输出最优计算次序
void TraceBack(int i, int j)
{
       if(i == j){
                printf("A%d", i);
       }
       else
                   {               
printf("(");
                TraceBack(i, s[i][j]);
                TraceBack(s[i][j]+1, j);
                printf(")");
       }
}
int main()
{
         printf("输入n:\n");
   scanf("%d",&n);
   printf("输入数组p[i]:\n");
        for(int i=0;i<=n;i++)
         scanf("%d",&p[i]);
         LookupChain(1,n);//调用函数
   
         printf("\n\n");
   printf("输出矩阵的m[][]:\n");
   for(int i=1;i<=n;i++)//输出矩阵的m[][]的值
    {
         for(intj=1;j<=n;j++)
         {
                   printf("%d\t",m[i][j]);
             }
         printf("\n");
    }
   
         printf("\n\n");
         printf("输出矩阵的s[][]:\n");
   for(int i=1;i<=n;i++)//输出矩阵的s[][]的值
    {
         for(intj=1;j<=n;j++)
         {
                   printf("%d\t",s[i][j]);
             }
         printf("\n");
    }
   
   printf("\n\n");
   printf("输出最优计算次序\n");
    TraceBack(1, n);
return 0;
}

运行效果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值