Description
Input
n表示矩阵的个数(<=100)
n+1个数,表示矩阵(<=100)
Output
最小的乘法次数
Sample Input
5
5 10 4 6 10 2
Sample Output
348
思路
我们先枚举合成矩阵的个数(len),再枚举矩阵的第一个(i),最后一个(j)就出来了,最后枚举分割线(k),用分割线前面矩阵花费的时间加上后面矩阵花费的时间,最后加上a[i]×a[k]×a[j+1] (因为是最后一个矩阵的列,所以还要加1)
动态转移方程:
代码
#include<cstdio>
#include<iostream>
using namespace std;
int f[105][105],n,s[105],h;
int main()
{
memset(f,127/3,sizeof(f));
int j=0;
scanf("%d",&n);
for (int i=1;i<=n+1;i++)
{
scanf("%d",&s[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]+s[i]*s[k]*s[j+1]);//动态转移方程
}
printf("%d",f[1][n]);
return 0;
}