第30次CSP第二题《矩阵运算》

矩阵运算

题目背景

在这里插入图片描述

题目描述

在这里插入图片描述

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 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();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值