[HNOI 2001]矩阵乘积

矩阵运算优化技巧
本文介绍了一种矩阵运算问题的高效解决方法,通过特定的输入处理方式避免了传统的高复杂度算法,实现$O(n^3)$级别的优化。文章提供了一个具体的C++实现案例。

Description

Input

Output

Sample Input

1 2                       
3 4 2 3
1 1 3
1 4 5
2 2 1
3 1 2

1 2 2
2 1 1
3 1 2
3 2 4

1 2 2
1 3 3
2 1 1
2 2 2

Sample Output

12

题解

直接做$O(n^3)$是肯定过不了的

由于只要求最后的$(x,y)$的值,

那么对于第一个矩阵我们只要管第$x$行,

第三个矩阵只要管$y$列,

由于满足数的乘法的分配率,我们可以边输入边处理。

这道题比较麻烦的应该在输入上...

我用了另外的三个变量记录上一次输入的$i$,$j$,$a$的值,就方便判断了。

 

 1 #include<set>
 2 #include<map>
 3 #include<cmath>
 4 #include<ctime>
 5 #include<queue>
 6 #include<stack>
 7 #include<cstdio>
 8 #include<string>
 9 #include<vector>
10 #include<cstdlib>
11 #include<cstring>
12 #include<iostream>
13 #include<algorithm>
14 #define LL long long
15 #define RE register
16 #define IL inline
17 using namespace std;
18 const int N=6000;
19 
20 int x,y,n,m,o,p;
21 int a[N+5],b[N+5];
22 int i,j,c,li,lj,lc;
23 
24 int main()
25 {
26     scanf("%d%d%d%d%d%d",&x,&y,&n,&m,&o,&p);
27     scanf("%d%d%d",&i,&j,&c);
28     while (true)
29     {
30         if (i==x) a[j]=c;
31         li=i,lj=j,lc=c;
32         scanf("%d%d%d",&i,&j,&c);
33         if (i<li||i==li&&j<=lj) break;
34     }
35     while (true)
36     {
37         b[j]+=a[i]*c;
38         li=i,lj=j,lc=c;
39         scanf("%d%d%d",&i,&j,&c);
40         if (i<li||i==li&&j<=lj) break;
41     }
42     memcpy(a,b,sizeof(a));
43     memset(b,0,sizeof(b));
44     while(true)
45     {
46         if (j==y) b[y]+=a[i]*c;
47         li=i,lj=j,lc=c;
48         scanf("%d%d%d",&i,&j,&c);
49         if (i<li||i==li&&j<=lj) break;
50     }
51     printf("%d\n",b[y]);
52     return 0;
53 }

 

 

 

转载于:https://www.cnblogs.com/NaVi-Awson/p/7401111.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值