矩阵乘法优化--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;

}


原创粉丝点击