HJ70 矩阵乘法计算量估算【python3】

题目描述

矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
编写程序计算不同的计算顺序需要进行的乘法次数。

数据范围:矩阵个数: 1 ≤ n ≤ 15 1\le n\le 15 1n15,行列数: 1 ≤ r o w i , c o l i ≤ 100 1\le row_i,col_i\le100 1rowi,coli100,保证给出的字符串表示的计算顺序唯一。
进阶:时间复杂度: O ( n ) O(n) O(n) ,空间复杂度: O ( n ) O(n) O(n)

输入描述

输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
计算的法则为一个字符串,仅由左右括号和大写字母(‘A’~‘Z’)组成,保证括号是匹配的且输入合法

输出描述

输出需要进行的乘法次数

代码

这个题目是利用栈对表达式进行求值的简单化,运算符号除了左右括号外,无外乎只有乘号。故类似的,遇到矩阵即字母就入栈,遇到有括号就弹出栈顶两个元素做乘积后再入栈。
由于要计算的是矩阵乘法的计算量,因此入阵的元素不是矩阵本身,而是矩阵的行列数组成的一个1*2列表

"""
遇到)就弹出栈顶两个元素计算后再入栈
"""


# 计算两个矩阵做乘法运算需要的计算次数.其中A[0]记录行数,A[1]记录列数
def cal(A,B):
    if A[1]!=B[0]:
        return False
    else:
        return A[0]*A[1]*B[1]

# S为传入的矩阵行列数的列表 euqation为算式
def f(S,equation):
    matrix_size=[] # 记录运算过程中矩阵的行列数
    num=0 # 记录矩阵的运算次数
    No=0 # 这是第几个矩阵
    for x in euqation:
        if x.isalpha():
            matrix_size.append(S[No])
            No+=1
        elif x==')':
            B=matrix_size.pop()
            A=matrix_size.pop()
            num+=cal(A,B)
            matrix_size.append([A[0],B[1]]) 

    return num



while True:
    try:
        n=int(input()) # 矩阵个数
        S=[] # 记录矩阵的行列数
        for _ in range(n):
            S.append([int(x) for x in input().split()])
        euqation=input()   
           
        print(f(S,euqation))
 
    except:
        break


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值