版权声明:(只对伍浩东同学声明)这是我的,不准拷表! 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;
}