矩阵乘法
矩阵乘法
时间限制: 1 Sec 内存限制: 128 MB题目描述
一个A×B的矩阵乘以一个B×C的矩阵将得到一个A×C的矩阵,时间复杂度为A×B×C。矩阵乘法满足结合律(但不满足交换律)。顺序给出n个矩阵的大小,请问计算出它们的乘积的最少需要花费多少时间。
输入
第一行输入一个正整数n(n≤100),表示有n个矩阵。
接下来m行每行两个正整数Xi,Yi,其中第i行的两个数表示第i个矩阵的规模为Xi x Yi。所有的Xi、Yi<=100。输入数据保证这些矩阵可以相乘。
接下来m行每行两个正整数Xi,Yi,其中第i行的两个数表示第i个矩阵的规模为Xi x Yi。所有的Xi、Yi<=100。输入数据保证这些矩阵可以相乘。
输出
输出最少需要花费的时间。
样例输入
3
10 100
100 5
5 50
样例输出
7500
提示
样例说明:顺序计算总耗时7500;先算后两个总耗时75000。
题解
一道区间DP题,根据矩阵乘的定义,参与复杂度计算的只有n+1个数,第一个矩阵的行数和列数,接下来n-1个矩阵的列数,这n+1个数存入一个数组a[]。
状态转移方程:f[i][k] = min{f[i][j] + f[j][k] + a[i]*a[j]*a[k]}
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 const int N = 109; 6 int n; 7 int a[N], f[N][N]; 8 int main() 9 { 10 scanf("%d", &n); 11 scanf("%d%d", &a[1], &a[2]); 12 for(int i = 2; i <= n; i++) 13 { 14 int x; 15 scanf("%d%d", &x, &a[i+1]); 16 } 17 memset(f, 0x3f, sizeof(f)); 18 for(int i = 1; i <= n; i++) 19 f[i][i] = 0, f[i][i+1] = 0; 20 for(int j = 1; j <= n+1; j++) 21 for(int i = 1; i + j - 1 <= n+1; i++) 22 { 23 int r = i + j - 1; 24 for(int k = i + 1; k < r; k++) 25 f[i][r] = min(f[i][r], f[i][k] + f[k][r] + a[i] * a[k] * a[r]); 26 } 27 printf("%d\n", f[1][n+1]); 28 return 0; 29 }