poj 3318 Matrix Multiplication【矩阵相乘】
poj 3318 Matrix Multiplication【矩阵相乘】
http://acm.pku.edu.cn/JudgeOnline/problem?id=3318
【题目大意】
给你三个矩阵A、B、C,矩阵的大小小于等于500 ,问A*B=C这个式子是否成立。
【提交情况】
一次AC
【解题思路】
由于两矩阵相乘的运算量很大,为0(n^3)所以直接运算必定超时,这是需要将运算简化,数学中有这样一个定理,如果X*A*B=X*C那么基本就可以认为A*B=C,定理数学上严格证明是错误的。不过有很大几率正确。我们可以用这个公式简化运算的过程,用一个行矩阵X左乘等式两端,那么算法即可转化成O(n^2),现在问题就是怎么取这个X,开始我用了十次随机数,后来发现其实只要取值均匀,一次即可,所以第二次是用1到n的n个数字。
【AC的代码】
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long llong;
llong a[510][510],b[510][510],c[510][510];
llong d[510],e[510],f[510],x[510];
int main()
{
llong n,i,j,randNum;
while(scanf("%lld",&n)!=EOF)
{
randNum=10;
for(i=0;i<n;i++) for(j=0;j<n;j++)
scanf("%lld",&a[i][j]);
for(i=0;i<n;i++) for(j=0;j<n;j++)
scanf("%lld",&b[i][j]);
for(i=0;i<n;i++) for(j=0;j<n;j++)
scanf("%lld",&c[i][j]);
for(i=0;i<n;i++) x[i]=i;
for(i=0;i<n;i++) f[i]=d[i]=e[i]=0;
for(i=0;i<n;i++) for(j=0;j<n;j++)
{
e[i]+=b[i][j]*x[j];
f[i]+=c[i][j]*x[j];
}
for(i=0;i<n;i++) for(j=0;j<n;j++)
d[i]+=a[i][j]*e[j];
for(i=0;i<n;i++) if(d[i]!=f[i]) break;
if(i<n) printf("NO\n");
else printf("YES\n");
}
return 0;
}
posted on 2010-03-05 10:27 liugoodness 阅读(157) 评论(0) 收藏 举报