思路讲解
利用矩阵乘法结合律减少时间与空间复杂度

(W(QxKt)) x V → W*Q x (Kt x V) (其实这些括号都是吓唬你的,乘法哪来的什么括号)*
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <bits/stdc++.h>
using namespace std; typedef long long ll; const ll N=1e4+10; ll n,d; ll Q[N][25],K[N][25],Kt[25][N],V[N][25],W[N],Ktv[25][25];
ll QK[N][25];
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>d; for(ll i=1;i<=n;++i) for(ll j=1;j<=d;++j) cin>>Q[i][j]; for(ll i=1;i<=n;++i) for(ll j=1;j<=d;++j) cin>>K[i][j]; for(ll i=1;i<=n;++i) for(ll j=1;j<=d;++j) cin>>V[i][j]; for(ll i=1;i<=n;++i) cin>>W[i]; for(int i=1;i<=n;++i) for(int j=1;j<=d;++j) Kt[j][i]=K[i][j]; for(int i=1;i<=d;++i) { for(int j=1;j<=d;++j) { for(int k=1;k<=n;++k) Ktv[i][j]+=Kt[i][k]*V[k][j]; } } for(int i=1;i<=n;++i) for(int j=1;j<=d;++j) Q[i][j]=W[i]*Q[i][j]; for(int i=1;i<=n;++i) { for(int j=1;j<=d;++j) { ll res=0; for(int k=1;k<=d;++k) { res+=Q[i][k]*Ktv[k][j]; } cout<<res<<" "; } cout<<endl; } return 0; }
|
心路历程(WA,TLE,MLE……)
哈哈,矩阵嘛,总是有点烦人的,特别是那个乘法的循环很容易写错,不过还好,样例比较强,直接AC了
今天还比较顺利