思路:
需要去调整运算顺序,以降低时间复杂度。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e4 + 10;
const int maxd = 30;
int q[maxn][maxd], k[maxn][maxd], v[maxn][maxd], w[maxn];
ll tmp[maxn][maxd], tmp2[maxn][maxd];
int n, d;
int main() {
cin >> n >> d;
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 >> k[i][j];
}
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];
//kv k要求转置
for (int i = 0; i < d; i++) {
for (int j = 0; j < d; j++) {
for (int idx = 0; idx < n; idx++) {
tmp[i][j] += k[idx][i] * v[idx][j];
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < d; j++) {
for (int idx = 0; idx < d; idx++) {
tmp2[i][j] += q[i][idx] * tmp[idx][j];
}
tmp2[i][j] *= w[i];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < d; j++) {
cout << tmp2[i][j] << " ";
}
cout << endl;
}
return 0;
}