CSP题解|202305-2 矩阵运算|70分
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,d;//n为矩阵的行数,d为列数
cin>>n>>d;
//输入三个n行d列的矩阵,KT为K转置
long long Q[n][d],KT[d][n],V[n][d];
long long W[n];
//输入三个矩阵
for(int i =0;i<n;i++)
for(int j=0;j<d;j++)
cin>>Q[i][j];
for(int i =0;i<n;i++)
for(int j=0;j<d;j++)
cin>>KT[j][i];
for(int i =0;i<n;i++)
for(int j=0;j<d;j++)
cin>>V[i][j];
//输入向量
for(int i =0;i<n;i++)
cin>>W[i];
//Q右乘KT
long long QKT[n][n];
for(int i =0;i<n;i++){
for(int j =0;j<n;j++){
QKT[i][j] = 0;
for(int k = 0;k<d;k++){
QKT[i][j]+=Q[i][k]*KT[k][j];
}
}
}
//W点乘QKT
for(int i =0;i<n;i++)
for(int j =0;j<n;j++)
QKT[i][j]*=W[i];
//运算后的QKT(n*n)右乘V(n*d)
long long res[n][d];
for(int i =0;i<n;i++){
for(int j =0;j<d;j++){
res[i][j]=0;
for(int k =0;k<n;k++){
res[i][j]+=QKT[i][k]*V[k][j];
}
}
}
//输出res
for(int i =0;i<n;i++){
for(int j =0;j<d;j++)
cout<<res[i][j]<<" ";
cout<<endl;
}
}
70分,应该是超时了,没有优化。
学习了矩阵乘法。
——————————————————
补:优化思路:乘法结合律:https://blog.csdn.net/qq_45123552/article/details/136766874
查看5道真题和解析
