矩阵运算
题目背景
题目描述
输入格式
从标准输入读入数据。
输入的第一行包含空格分隔的两个正整数 n 和 d,表示矩阵的大小。
接下来依次输入矩阵 Q、K 和 V。每个矩阵输入 n 行,每行包含空格分隔的 d 个整数,其中第 i 行的第 j 个数对应矩阵的第 i 行、第 j 列。
最后一行输入 n 个整数,表示向量 W。
输出格式
输出到标准输出。
输出共 n 行,每行包含空格分隔的 d 个整数,表示计算的结果。
样例输入
3 2
1 2
3 4
5 6
10 10
-20 -20
30 30
6 5
4 3
2 1
4 0 -5
样例输出
480 240
0 0
-2200 -1100
题解
package hello30;
import java.util.Scanner;
/**
* 矩阵运算
*/
public class Csp302 {
private static final int N = 10010, D = 30;
private static long[][] tmp = new long[D][D];
private static long[][] ans = new long[N][N];
private static int n, d;
private static int[][] Q = new int[N][D];
private static int[][] K = new int[N][D];
private static int[][] V = new int[N][D];
private static int[] W = new int[N];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
d = scanner.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= d; j++) {
Q[i][j] = scanner.nextInt();
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= d; j++) {
K[i][j] = scanner.nextInt();
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= d; j++) {
V[i][j] = scanner.nextInt();
}
}
for (int i = 1; i <= n; i++) {
W[i] = scanner.nextInt();
}
// 计算 Q * V = tmp
for (int i = 1; i <= d; i++) {
for (int j = 1; j <= d; j++) {
for (int k = 1; k <= n; k++) {
tmp[i][j] += K[k][i] * V[k][j];
}
}
}
// 计算 K * tmp = ans
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= d; j++) {
for (int k = 1; k <= d; k++) {
ans[i][j] += Q[i][k] * tmp[k][j];
}
ans[i][j] *= (long) W[i];
}
}
// 输出结果
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= d; j++) {
System.out.print(ans[i][j] + " ");
}
System.out.println();
}
scanner.close();
}
}
ystem.out.println();
}
scanner.close();
}
}