暴力相乘肯定会超时,所以核心是要降低乘法次数
首先要明确一个大小为n×d的矩阵A与一个大小为d×k的矩阵B相乘,需要做n×d×k次乘法运算。
那么本道题目有两种运算顺序:
对应的运算次数(忽略点乘)为
对应的运算次数(忽略点乘)为
所以如果n≥d,就采用第一种顺序计算,反之第二种。
python代码
def mul(A, B): # 矩阵相乘
C = [[0 for _ in range(len(B[0]))] for _ in range(len(A))]
for i in range(len(A)):
for j in range(len(B[0])):
C[i][j] = sum(A[i][k] * B[k][j] for k in range(len(B)))
return C
def dianC(vector, A): # 点乘
for i in range(len(vector)):
A[i] = [j*vector[i] for j in A[i]]
return A
n,d = map(int, input().split())
Q = []
K = []
V = []
for i in range(n):
Q.append(list(map(int,input().split())))
for i in range(n):
K.append(list(map(int,input().split())))
for i in range(n):
V.append(list(map(int,input().split())))
W = list(map(int, input().split()))
RK = [[K[j][i] for j in range(len(K))] for i in range(len(K[0]))]
if n >= d:
res = dianC(W,mul(Q,mul(RK,V)))
else:
res = dianC(W,mul(mul(Q,RK),V))
for i in res:
print(" ".join(str(j) for j in i))