华为oj中级 矩阵乘法估算量

本文介绍了一种通过调整矩阵乘法顺序来减少计算量的方法,并提供了一个示例程序,该程序能够根据不同的矩阵乘法顺序计算所需的乘法次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述
矩阵乘法的运算量与矩阵乘法的顺序强相关。

例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵

计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。

编写程序计算不同的计算顺序需要进行的乘法次数

知识点 字符串
运行时间限制 10M
内存限制 128
输入
输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
3 //矩阵个数n
50 10 //矩阵A的行数50,列数10
10 20 //矩阵B的行数10,列数20
20 5 //矩阵C的行数20,列数5
(A(BC)) //矩阵从A开始命名,A、B、C、D…以此类推,通过括号表示运算顺序

输出
输出需要进行的乘法次数
样例输入 3 50 10 10 20 20 5 (A(BC))
样例输出 3500

#include<stdio.h>  
#include<string.h>  

int list[50][2],n=0;  
char string[100];  

int main()  
{  
    int i=0,j=0,length=0,cal=0,sum=0,multi=1;  
    char p;  
    scanf("%d",&n);  
    for(i=0;i<n;i++)  
    {  
        scanf("%d%d",&list[i][0],&list[i][1]);  
    }  
    scanf("%s",string);  
    length=strlen(string);  
    for(i=0;i<length;i++)  
    {  
        if(string[i]==')')  
        {  
            int flag=0;  
            string[i]=' ';  
            cal=i-1;  
            while(cal>=0)  
            {  
                if(string[cal]=='(')break;  
                cal--;  
            }  
            string[cal++]=' ';  
            multi=1;  
            while(cal!=i)  
            {  
                if(string[cal]>='A' && string[cal]<='Z')  
                {  
                    if(flag==0)  
                    {  
                        p=string[cal];  
                        multi=list[string[cal]-'A'][0]*list[string[cal]-'A'][1];  
                    }else  
                    {  
                        list[p-'A'][1]=list[string[cal]-'A'][1];  
                        multi=multi*list[string[cal]-'A'][1];  
                        string[cal]=' ';  
                    }  
                    flag=1;  
                }  
                cal++;  
            }  
            sum=sum+multi;  
        }  
    }  
    printf("%d\n",sum);  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值