矩阵乘法优化--hdu4920 滚动数组
来源:互联网 发布:淘宝扣除保证金的规则 编辑:程序博客网 时间:2024/06/14 08:14
给定矩阵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 namespacestd;
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");
elseprintf(" ");
}
}
}
};
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();
}
return0;
}
- 矩阵乘法优化--hdu4920 滚动数组
- HDU4920矩阵乘法优化之转置
- hdu4920 滚动数组的矩阵相乘
- hdu4920 矩阵乘法%3
- hdu4920(矩阵 乘法)
- HDU4920 矩阵乘法
- hdu4920 Matrix multiplication [矩阵乘法 压位 ]
- HDU4920 Matrix multiplication 矩阵
- 递归+优化 一维数组实现矩阵乘法
- 矩阵乘法的优化
- CUDA 矩阵乘法优化
- 矩阵乘法的优化
- CUDA: 矩阵乘法优化
- 矩阵乘法的优化
- 矩阵乘法优化
- CUDA: 矩阵乘法优化
- 矩阵乘法cache优化
- 矩阵乘法的优化
- 并行计算之路<4>——CUDA牵手OpenCV
- F
- JAVA日志系统
- 大数据应用的四个常规错误认识
- tmux
- 矩阵乘法优化--hdu4920 滚动数组
- Java正则表达式详解
- 算法学习记录九(C++)--->二进制中1的个数
- Spark DataFram 脏数据与databricks
- Shell[三]: source命令
- 51NOD1009 数字1的数量
- 几个调度器参数说明:
- laravel下使用memcached
- Android Gradle Plugin获取依赖API详解