矩阵链相乘

版权声明:(只对伍浩东同学声明)这是我的,不准拷表! https://blog.csdn.net/weixin_43346722/article/details/85011803

矩阵链相乘

题目

假设我们要用标准的矩阵乘法来计算M1,M2,M3三个矩阵的乘积M1M2M3,这三个矩阵的维数分别是2×10,10×2,2×10,如果把M1,M2相乘,那么要2×10×2+2×2×10=80,如果代之已用M2,M3相乘的结果去乘M1,那么数量乘法的次数变成了10×2×10+2×10×10=400,执行M1(M2M3)耗费的时间是执行乘法(M1M2)M3的5倍。

输入

n表示矩阵的个数(<=100)
n+1个数,表示矩阵(<=100)

输入样例

5
5 10 4 6 10 2

输出

最小的乘法次数

输出样例

348

思路

我们先枚举合成矩阵的个数,再枚举矩阵的第一个(i),最后一个(j)就出来了,最后枚举分割线(k),用分割线前面矩阵花费的时间加上后面矩阵花费的时间,最后加上a[i]×a[k]×a[j+1] (因为是最后一个矩阵的列,所以还要加1)
动态转移方程为:
在这里插入图片描述

代码

#include<cstdio>
#include<iostream>
using namespace std;
int f[105][105],a[105],n,temp;//初始化
int main()
{
	memset(f,127/3,sizeof(f));//先把f设为很大,以便求最小值
	scanf("%d",&n);//读入
	for (int i=1;i<=n+1;i++)
	{
		scanf("%d",&a[i]);//读入
		f[i][i]=0;//标记初值
	}
	for(int len=2;len<=n;len++)//枚举长度
	for(int i=1;i<=n-len+1;i++)//枚举前面的矩阵
	{
		int j=i+len-1;//制定后面的矩阵的边界
		for(int k=i+1;k<=j;k++)//枚举后面的矩阵
		f[i][j]=min(f[i][j],f[i][k-1]+f[k][j]+a[i]*a[k]*a[j+1]);//动态转移方程
	}
	printf("%d",f[1][n]);//输出
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43346722/article/details/85011803
今日推荐