HJ70. 矩阵乘法计算量估算
描述
矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
输入描述
输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则计算的法则为一个字符串,仅由左右括号和大写字母('A'~'Z')组成,保证括号是匹配的且输入合法!
输出描述
输出需要进行的乘法次数
示例1
输入:
3 50 10 10 20 20 5 (A(BC))
输出:
3500
C 解法, 执行用时: 1ms, 内存消耗: 272KB, 提交时间: 2020-12-09
#include <stdio.h> #include <string.h> #define MAXSIZE 500 int main(){ int n; while(scanf("%d", &n) != EOF){ int i, j = 0, res = 0; int row[MAXSIZE] = {0}, col[MAXSIZE] = {0}; char type[MAXSIZE] = {'\0'}, temp[MAXSIZE] = {'\0'}; for(i=0; i<n; i++) scanf("%d%d", &row[i], &col[i]); scanf("%s", type); for(i=0; i<strlen(type); i++){ if(type[i] == '(') continue; else temp[j++] = type[i]; } for(i=0; i<strlen(temp); i++){ if(temp[i] == ')'){ res += row[temp[i-2]-'A'] * col[temp[i-2]-'A'] * col[temp[i-1]-'A']; col[temp[i-2]-'A'] = col[temp[i-1]-'A']; strcpy(&temp[i-1], &temp[i+1]); i -= 2; } } printf("%d\n", res); } return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2020-12-23
#include<stdio.h> int main() { int input=0; while(scanf("%d",&input)!=EOF) { char str[1000]; int Array[input][2]; char temp[1000]; int new_matrix[2]; for(int i=0;i<input;i++) { scanf("%d %d",&Array[i][0],&Array[i][1]); //printf("%d %d\n",Array[i][0],Array[i][1]); } scanf("%s",str); int size = strlen(str); int sum =0;int j= 0; for(int i=0;i<size;i++) { if(str[i]=='(') { continue; } else { temp[j++]=str[i]; } } for(int i=0;i<strlen(temp);i++) { if(temp[i]==')') { sum += Array[temp[i-2]-'A'][0]*Array[temp[i-2]-'A'][1]*Array[temp[i-1]-'A'][1]; Array[temp[i-2]-'A'][1]=Array[temp[i-1]-'A'][1]; strcpy(&temp[i-1],&temp[i+1]); i = i-2; } } printf("%d\n",sum); } return 0; }