题目描述
矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
编写程序计算不同的计算顺序需要进行的乘法次数。
数据范围:矩阵个数:
1
≤
n
≤
15
1\le n\le 15
1≤n≤15,行列数:
1
≤
r
o
w
i
,
c
o
l
i
≤
100
1\le row_i,col_i\le100
1≤rowi,coli≤100,保证给出的字符串表示的计算顺序唯一。
进阶:时间复杂度:
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