矩阵链相乘【DP】SSL 1596
Description–
Input–
第一行,n表示矩阵的个数(n<=100)。
第二行,n+1个数。
Output–
最小的乘法次数
Sample Input–
5
5 10 4 6 10 2
Sample Output–
348
解题思路
- 乘法交换律
- 乘法结合律
- 也就是说我们可以
这样分
状态转移方程:
f[i][j]=min(f[i][j],f[i][k-1]+f[k][j]+a[i]*a[k]*a[j+1])
代码
-
感谢fy同学
#include<cstdio> int n,a[110],c[110][110]; int min(int asa,int b) { if(asa<b) return asa; return b; } int main() { scanf("%d",&n); for (int i=1;i<=n+1;i++) scanf("%d",&a[i]); for (int d=2;d<=n;d++) for (int i=1;i<=n-d+1;i++) { int j=i+d-1,t; c[i][j]=10000000; for(int k=i+1;k<=j;k++) c[i][j]=min(c[i][j],c[i][k-1]+c[k][j]+a[i]*a[j+1]*a[k]); } printf("%d",c[1][n]); return 0; }
—再次感谢fy同学—