矩阵乘法优化--hdu4920 滚动数组
2017-08-11 14:51
387 查看
给定矩阵A,B,对3取余,求乘积。n = 800
取余后,很多0
//对于高阶并且稀疏的矩阵,非常适合用滚动矩阵优化
//原理:n*n的矩阵,每个位置,有A某行的n个数和B某列的n个数分别相乘相加得。
//只要满足C[i][j] = A[i][k] * B[k][j] (k = 0..n - 1),加数的顺序并不重要。并不一定要一次性算出C[i][j]的值,可以分多次求和。所以i,j,k顺序可互换
//当A[i][k]为0时,不论B[k][j]是多少,相乘都为0,所以就干脆不枚举B了,这一次就不加了。
//1747ms
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace
std;
const int maxn =
800 + 5;
struct matrix{
int sz;
int m[maxn][maxn];
matrix(int n){
sz = n;
memset(m,
0, sizeof(m));
}
void input(){
for(int i =
0;i < sz;i ++)
for(int j =
0;j < sz;j ++)
{ scanf("%d",&m[i][j]);
m[i][j] %=
3; }
}
void output(){
for(int i =
0;i < sz;i ++){
for(int j =
0;j < sz;j ++){
printf("%d",m[i][j]);
if(j ==
sz - 1)
printf("\n");
else
printf(" ");
}
}
}
};
void multiply(matrix &a,matrix &b,matrix
&c)
{
for (int i =
0; i < a.sz; i ++) {
for (int k =
0; k < a.sz; k ++) {//**
if(a.m[i][k] ==
0) continue;
for (int j =
0; j < a.sz; j ++) {
c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j])
% 3;//~
}
}
}
}
int main()
{
int n;
while (cin >> n) {
matrix a(n),b(n),c(n);
a.input();b.input();
multiply(a, b, c);
c.output();
}
return
0;
}
取余后,很多0
//对于高阶并且稀疏的矩阵,非常适合用滚动矩阵优化
//原理:n*n的矩阵,每个位置,有A某行的n个数和B某列的n个数分别相乘相加得。
//只要满足C[i][j] = A[i][k] * B[k][j] (k = 0..n - 1),加数的顺序并不重要。并不一定要一次性算出C[i][j]的值,可以分多次求和。所以i,j,k顺序可互换
//当A[i][k]为0时,不论B[k][j]是多少,相乘都为0,所以就干脆不枚举B了,这一次就不加了。
//1747ms
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace
std;
const int maxn =
800 + 5;
struct matrix{
int sz;
int m[maxn][maxn];
matrix(int n){
sz = n;
memset(m,
0, sizeof(m));
}
void input(){
for(int i =
0;i < sz;i ++)
for(int j =
0;j < sz;j ++)
{ scanf("%d",&m[i][j]);
m[i][j] %=
3; }
}
void output(){
for(int i =
0;i < sz;i ++){
for(int j =
0;j < sz;j ++){
printf("%d",m[i][j]);
if(j ==
sz - 1)
printf("\n");
else
printf(" ");
}
}
}
};
void multiply(matrix &a,matrix &b,matrix
&c)
{
for (int i =
0; i < a.sz; i ++) {
for (int k =
0; k < a.sz; k ++) {//**
if(a.m[i][k] ==
0) continue;
for (int j =
0; j < a.sz; j ++) {
c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j])
% 3;//~
}
}
}
}
int main()
{
int n;
while (cin >> n) {
matrix a(n),b(n),c(n);
a.input();b.input();
multiply(a, b, c);
c.output();
}
return
0;
}
相关文章推荐
- 一道简单的递推题(快速幂+矩阵乘法优化+滚动数组)
- hdu4920 滚动数组的矩阵相乘
- 一些常见的优化:读入优化,滚动数组
- strassen算法优化矩阵乘法
- fzu 1692 Key problem(循环同构矩阵o(n^2)优化乘法)
- POJ 3735 矩阵乘法的小优化GET。
- 矩阵乘法优化
- 用矩阵乘法优化的线性齐次递推公式求值
- [矩阵乘法特征多项式优化]黄金
- BZOJ1009 GT考试 (DP 矩阵乘法优化)
- [矩阵乘法优化DP] Topcoder SRM554. TheBrickTowerHardDivOne
- HDU 2602 Bone Collector(01二维背包&一维背包&滚动数组优化二维背包的原理 )
- 1009: [HNOI2008]GT考试 矩阵乘法优化DP+KMP
- POJ 3735 Training little cats(矩阵乘法 + 稀疏矩阵优化)——2016弱校联盟十一专场10.7(12点场)
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
- ARM处理器NEON编程及优化技巧三—矩阵乘法的实例
- 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)
- 一个矩阵乘法优化期望dp的题
- hdu 3392 利用滚动数组优化的dp
- Fibonacci数列--矩阵乘法优化