列表

详情


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;
}

上一题