ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

矩阵乘法

2020-03-13 21:03:24  阅读:221  来源: 互联网

标签:Yi Xi int 矩阵 100 include 乘法


矩阵乘法

时间限制: 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。输入数据保证这些矩阵可以相乘。

输出

输出最少需要花费的时间。

样例输入

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 }
View Code

 

 

标签:Yi,Xi,int,矩阵,100,include,乘法
来源: https://www.cnblogs.com/Jony-English/p/12488950.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有