1. 程式人生 > >【DP】SSL 1596矩陣鏈相乘

【DP】SSL 1596矩陣鏈相乘

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)
動態轉移方程:
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])

程式碼

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