【DP】SSL 1596矩阵链相乘

Description

【DP】SSL 1596矩阵链相乘_第1张图片

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)
动态转移方程:
f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i ] [ k − 1 ] + f [ k ] [ j ] + s [ i ] ∗ s [ k ] ∗ s [ j + 1 ] ) f[i][j]=min(f[i][j],f[i][k-1]+f[k][j]+s[i]*s[k]*s[j+1]) f[i][j]=min(f[i][j],f[i][k1]+f[k][j]+s[i]s[k]s[j+1])

代码

#include
#include
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;  
}


你可能感兴趣的:(DP)