【DP】SSL 1596矩陣鏈相乘
阿新 • • 發佈:2018-12-15
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;
}