POJ 3318-Matrix Multiplication (n方求矩阵相乘相等)

题意

有3个n*n的矩阵A,B,C,问AB是否等于C。

传送门

思路

题目描述很简单,就是用矩阵乘法,但是很明显矩阵乘法的时间复杂度为O(n^3),很明显超时。那怎么改进呢?就是用压缩矩阵的方法

设矩阵R是 1*n 的矩阵,根据矩阵的性质,若 A * B * R = C * R,那么A * B = C。由此可以看出来,虽然多成了一个矩阵,但是时间复杂度成了\(O(n^2)\)。那么问题是这个R的行列式该怎么设定,有人用的随机算法,但是随机算法可能在关键点上出现错误,可以将R设定成一个递增的数列\(\{1,2,3…\}\)

Code

#include <bits/stdc++.h>

using namespace std;

const int maxn = 510;

int n;
int ra[maxn], rab[maxn], rc[maxn];

int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn];

bool check() {
    for (int i = 0; i < n; ++i) {
        if(rab[i] != rc[i]) return false;
    }
    return true;
}

int main() {
    while(scanf("%d", &n)==1) {
        for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) scanf("%d", &a[i][j]);
        for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) scanf("%d", &b[i][j]);
        for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) scanf("%d", &c[i][j]);

        for (int i = 0; i < n; ++i) ra[i] = rab[i] = rc[i] = 0;

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j)
                ra[i] += a[j][i]*(j+1);
        }

//        for (int i = 0; i < n; ++i) printf("%d ", ra[i]); puts("");

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j)
                rab[i] += ra[j]*b[j][i];
        }

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j)
                rc[i] += c[j][i]*(j+1);
        }
//        for (int i = 0; i < n; ++i) printf("%d ", rc[i]); puts("");

        puts(check()? "YES": "NO");
    }
    return 0;
}
posted @ 2019-10-02 23:38  Acerkoo  阅读(195)  评论(0编辑  收藏  举报