矩阵连乘问题:
#include <stdio.h>
#include <iostream>
#define NUM 51
int n;
int p[NUM];
int m[NUM][NUM];
int s[NUM][NUM];
void matrixChain()
{
for(int i=1;i<=n;i++) //填主对角线d1
{
m[i][i]=0;
}
for(int r=2;r<=n;r++)//填次对角线dr(r=2~n)
{
for(int i=1;i<=n-r+1;i++)//填次对角线的各个元素
{
int j=i+r-1;//计算次对角线dr上第i行的元素的列标
m[i][j]=m[i+1][j]+ p[i-1]*p[i]*p[j];//用计算Ai(Ai+1…Aj)的次数作为m[i][j]的初始值
s[i][j]=i;//保存分界点
for(int k=i+1;k<j;k++)
{//用m[i][k]和m[k+1][j]计算m[i][j]的新值
int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j])
{
m[i][j]=t;
s[i][j]=k;
}
}
}
}
}
void TraceBack(int i, int j)
{
if(i == j){
printf("A%d", i);
}
if(i < j){
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]);
matrixChain();//调用函数
printf("\n\n");
printf("输出矩阵的m[][]:\n");
for(int i=1;i<=n;i++)//输出矩阵的m[][]的值
{
for(int j=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(int j=1;j<=n;j++)
{
printf("%d\t",s[i][j]);
}
printf("\n");
}
printf("\n\n");
printf("输出最优计算次序\n");
TraceBack(1, n);
return 0;
}
运行效果:
![](https://img-blog.csdn.net/20161113180158347)