计算矩阵连乘积的备忘录算法
#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;
}
运行效果: