通过率 100% · 提交 2 · 通过 2
这道 OJ 的配套动画
矩阵乘法与维度检查 · 对应本题的思路、过程和代码
给定特征矩阵 A(m 行 k 列)与变换矩阵 B(p 行 n 列)。计算前先检查矩阵维度:只有 A 的列数等于 B 的行数(k = p)时,矩阵乘法才有定义。若 k ≠ p,输出固定字符串 shape mismatch;否则输出 C = A × B(m 行 n 列),其中 C[i][j] = Σ_t A[i][t] × B[t][j]。
这类题属于算法机考高频题型中「矩阵运算 / 模拟」方向的高频题型,通常考察对「矩阵运算 / 模拟」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行两个整数 m k;随后 m 行、每行 k 个整数,表示矩阵 A。再一行两个整数 p n;随后 p 行、每行 n 个整数,表示矩阵 B。
k ≠ p 时输出一行 shape mismatch;否则输出 m 行、每行 n 个整数(单个空格分隔)。
1 <= m, k, p, n <= 200;|元素| <= 1,000,000。累加和的绝对值可达 2×10^14,必须使用 64 位整数做乘加。
示例 1
输入示例
2 3 1 2 3 4 5 6 3 2 7 8 9 10 11 12
输出示例
58 64 139 154
2×3 矩阵乘 3×2 矩阵
示例 2
输入示例
2 2 1 2 3 4 3 2 5 6 7 8 9 10
输出示例
shape mismatch
k=2 与 p=3 不匹配
时间限制 4000 ms · 内存限制 256 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
训练营动画视频讲解
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有
先检查 A 的列数 k 是否等于 B 的行数 p;不相等时立即输出 shape mismatch。维度合法时,对每个输出位置 (i,j) 枚举公共维度 t,累加 A[i][t]×B[t][j]。乘积与累加和都使用 64 位整数。
当 k=p 时,三重循环为每个 (i,j) 恰好枚举定义式中的全部 k 项,没有遗漏或重复,因此得到矩阵乘积 C。k≠p 时不存在可配对的公共维度,直接进入错误分支与题意一致。
时间复杂度 O(mkn),输出矩阵占用 O(mn) 空间。
重点检查非方阵、1×k 乘 k×1、k=1 以及接近 2×10^14 的累加结果。
import sys
def main() -> None:
data = sys.stdin.buffer.read().split()
it = iter(data)
m = int(next(it)); k = int(next(it))
a = [[int(next(it)) for _ in range(k)] for _ in range(m)]
p = int(next(it)); n = int(next(it))
b = [[int(next(it)) for _ in range(n)] for _ in range(p)]
if k != p:
print("shape mismatch")
return
out_lines = []
for i in range(m):
row_a = a[i]
acc = [0] * n
for t in range(k):
v = row_a[t]
if v:
row_b = b[t]
for j in range(n):
acc[j] += v * row_b[j]
out_lines.append(" ".join(map(str, acc)))
sys.stdout.write("\n".join(out_lines) + "\n")
if __name__ == "__main__":
main()