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

Posted acerkoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于POJ 3318-Matrix Multiplication (n方求矩阵相乘相等)的主要内容,如果未能解决你的问题,请参考以下文章

问一下数学术语的英文说法

POJ题目总结

POJ 刷题指南

DP50题(转)

POJ题目分类

计算几何专题