第30次CSP第二题——矩阵运算
题目网址:https://sim.csp.thusaac.com/contest/30/problem/1
以下解答仅供参考:
#include <iostream> #include <vector> using namespace std; int main(){ int n,d; cin>>n>>d; //输入矩阵Q vector<vector<int>> Q(n,vector<int>(d)); for(int i=0;i<n;i++){ for(int j=0;j<d;j++){ cin>>Q[i][j]; } } //输入矩阵K vector<vector<int>> K(n,vector<int>(d)); for(int i=0;i<n;i++){ for(int j=0;j<d;j++){ cin>>K[i][j]; } } //输入矩阵V vector<vector<int>> V(n,vector<int>(d)); for(int i=0;i<n;i++){ for(int j=0;j<d;j++){ cin>>V[i][j]; } } //输入向量W vector<int> W(n); for(int i=0;i<n;i++){ cin>>W[i]; } //QxK^T 得到一个nxn的矩阵 vector<vector<long long>> QKT(n,vector<long long>(n)); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ long long sum=0; for(int k=0;k<d;k++){ sum+=(long long)Q[i][k]*K[j][k]; } QKT[i][j]=sum; } } //W*(QxK^T) for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ QKT[i][j]*=W[i]; } } //R Result最后的结果矩阵 vector<vector<long long>> R(n,vector<long long>(d)); for(int i=0;i<n;i++){ for(int j=0;j<d;j++){ long long sum=0; for(int k=0;k<n;k++){ sum+=QKT[i][k]*V[k][j]; } R[i][j]=sum; } } //输出结果矩阵R for(int i=0;i<n;i++){ for(int j=0;j<d;j++){ cout<<R[i][j]; if(j<d-1) cout<<" "; } cout<<endl; } return 0; }运行结果:
