题目:
矩阵连乘,但是只乘3次,无需动态规划。根据题意d数值远小于n,先做矩阵Q乘K再乘V需要做n*d*n+n*n*d次乘法,循环次数太多,会超时。先做矩阵K乘V再乘Q需要做d*n*d+n*d*d次乘法,循环次数大大减少。
根据提示,计算结果太大,需要用到long long型。
(纯记录向,在校生写给自己看,代码很烂)
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, d;
cin>>n>>d;
//输入
map<int, map<int, int> > Q, K, V, W;
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
cin>>Q[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
cin>>K[j][i];
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
cin>>V[i][j];
for(int i=1;i<=n;i++)
cin>>W[1][i];
//V*K
map<long long, map<long long, long long> > ans;
for(int i=1;i<=d;i++){
for(int j=1;j<=d;j++){
int x=0;
for(int k=1;k<=n;k++) x+=K[i][k]*V[k][j];
ans[i][j] = x;
}
}
//Q*ans
for(int i=1;i<=n;i++){
for(int j=1;j<=d;j++){
long long x=0;
for(int k=1;k<=d;k++) x+=Q[i][k]*ans[k][j];
x*=W[1][i];
cout<<x<<' ';
}
cout<<endl;
}
}