题意
有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;
}