题目大意:
求最小矩阵相乘次数
矩阵相乘次数定义:
A(m·n)*B(n·p)的次数为m·n·p
解题思路:
区间dp
转移方程
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[i]∗a[k+1]∗a[j+1]);
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
j
]
,
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
+
a
[
i
]
∗
a
[
k
+
1
]
∗
a
[
j
+
1
]
)
;
知道了这些其他都比较水—
源程序:
#include<cstdio>
#include<cstring>
#define min(a,b) a>b?b:a;
using namespace std;
int n,a[505],f[505][505];
int main()
{
memset(f,127/3,sizeof(f));//初始化f为∞
scanf("%d",&n);
for (int i=1;i<=n;i++) f[i][i]=0;
//f[i][i]要特殊初始化(f[i][j]表示第i个乘到第j个,这道题里没有自己乘自己这种存在)
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i],&a[i+1]);//读入,数据保证a[i]=b[i-1]
for (int j=2;j<=n;j++)
for (int i=j-1;i>=1;i--)
for (int k=i;k<=j-1;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]);
//dp骚一波
printf("%d",f[1][n]);
}