矩阵链乘法问题

n个矩阵相乘

 有一系列矩阵按顺序排列

 每个矩阵的行数=前一个矩阵的列数

n个矩阵相乘也称为矩阵链乘法

问题:如何确定相乘的顺序(给矩阵加括号),提高计算效率 ?

#include<iostream>
#define M 10000
using namespace std;
int Matrix_Chain_Multiply(int p[],int n,int D[][10],int Rec[][10])
{
	int l,i,j,k,q;
	for(l=2;l<=n;l++)  //子链的长度 
	{
		for(i=1;i<=n-l+1;i++) //依次计算 
		{
			j=i+l-1;
			for(k=i;k<=j-1;k++) //切割的位置 
			{
				q=D[i][k]+D[k+1][j]+p[i-1]*p[k]*p[j];
				if(q<D[i][j])
				{
					D[i][j]=q;
					Rec[i][j]=k;
				}
			}
		}
	}
	return D[1][n];
}
void print_Matrix_Chain(string U[],int Rec[][10],int i,int j)
{
	if(i==j)
	{
		cout<<U[i];
		return;
	}
	cout<<"(";
	print_Matrix_Chain(U,Rec,i,Rec[i][j]);
	cout<<")(";
	print_Matrix_Chain(U,Rec,Rec[i][j]+1,j);
	cout<<")";
	return;
}
int main()
{
	int n=6;
	int p[7]={2,3,7,9,5,2,4};
	string U[7]={"U0","U1","U2","U3","U4","U5","U6"};
	int D[10][10],Rec[10][10];
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(i==j)
			D[i][j]=0;
			else
			D[i][j]=M;
		}
	}
	cout<<"最少计算次数为:"<<Matrix_Chain_Multiply(p,n,D,Rec)<<endl;
	cout<<"分割方案为:";
	print_Matrix_Chain(U,Rec,1,n);
} 

运行结果·:

最少计算次数为:286
分割方案为:((U1)((U2)((U3)((U4)(U5)))))(U6)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUAA-附鹤@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值