原题链接:矩阵相乘
首先我们要知道矩阵什么时候才能进行相乘:首先,两个矩阵要是想相乘需要满足,第一个矩阵的列数等于第二个矩阵的行数。
具体的做法是:
最终得到的矩阵的结果是:新矩阵的行数等于左边矩阵的行数,新矩阵的列数等于右边矩阵的列数,即左行右列。一个m*n的矩阵和一个n*p的矩阵相乘,将会得到一个m*p的矩阵。
接下来是两个矩阵相乘的代码实现,需要用到三个循环
cin>>n>>m;//矩阵a为n*m(n行m列)
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
cin>>p; //矩阵b为m*p(m行p列)
for(int i=0;i<m;i++)
for(int j=0;j<p;j++)
scanf("%d",&b[i][j]);
for(int i=0;i<n;i++) //矩阵c是a与b相乘得到的
for(int j=0;j<p;j++) //n*p(n行p列)
for(int k=0;k<m;k++)
c[i][j]+=a[i][k]*b[k][j];
这个循环的边界其实也很好记忆,因为左行右列,所以c矩阵是一个n*p的矩阵,所以外层的两层循环分别是n和p,最内层是m(左列==右行==m);
当然在这个题目中,我们要知道这道题的重点在于时间复杂度,如果先算QK矩阵相乘,会得到n * n的矩阵,会显示超时,所以要先算后面两个矩阵,时间复杂度是可以过的。因为先计算后面两个矩阵得到的是一个k*k的矩阵k<20;同时还要注意的一点是这个题目中中间过程存储数据的数组要用long long类型
下面是代码实现
#include<iostream>
using namespace std;
long long temp[20][20],temp2[10000][20];
int Q[10000][20],K[20][10000],V[10000][20];
int main(){
int n,d;
cin>>n>>d;
for(int i=0;i<n;i++){
for(int k=0;k<d;k++){
scanf("%d", &Q[i][k]);
}
}
for(int i=0;i<n;i++){
for(int k=0;k<d;k++){
scanf("%d", &K[k][i]);
}
}
for(int i=0;i<n;i++){
for(int k=0;k<d;k++){
scanf("%d", &V[i][k]);
}
}
int W[n];
for(int i=0;i<n;i++){
scanf("%d", &W[i]);
}
//前面代码没问题
for(int i=0;i<d;i++){
for(int k=0;k<d;k++){
for(int j=0;j<n;j++){
temp[i][k]+=K[i][j]*V[j][k];
}
}
}
for(int i=0;i<n;i++){
for(int k=0;k<d;k++){
for(int j=0;j<d;j++){
temp2[i][k]+=Q[i][j]*temp[j][k];
}
}
}
for(int i=0;i<n;i++){
for(int k=0;k<d;k++){
temp2[i][k]*=W[i];
}
}
for(int i=0;i<n;i++){
for(int k=0;k<d;k++){
cout<<temp2[i][k]<<' ';
}
cout<<endl;
}
return 0;
}