您的位置:首页 > 其它

51NOD 1140 矩阵相乘结果的判断(随机化算法+矩阵结合率)

2017-04-22 19:35 288 查看
传送门

给出三个N*N的矩阵A, B, C,问A * B是否等于C?

Input

第1行,1个数N。(0 <= N <= 500)

第2 - N + 1行:每行N个数,对应矩阵A的元素。(0 <= M[i] <= 16)

第N + 2 - 2N + 1行:每行N个数,对应矩阵B的元素。(0 <= M[i] <= 16)

第2N + 2 - 3N + 1行:每行N个数,对应矩阵C的元素。

Output

如果相等输出Yes,否则输出No。

Input示例

2

1 0

0 1

0 1

1 0

0 1

1 0

Output示例

Yes

解题思路:

正常我们计算矩阵乘法的时候复杂度 O(n3),在本题中如果是这样算的话肯定会超时,所以我们就构造一个 1∗n 的矩阵,在A∗B=C 的左边分别乘以这个 1∗n 的矩阵,然后就将算法的复杂度降下来了,然后就为 O(n2),然后就想办法构造这样的一个矩阵,所以就考虑到了随机化算法,然后随机一个 1∗n 的矩阵,作为计算,最后判断就行了,然后这样写完之后莫名奇妙的超时了,结果换了 VisualC++之后就过了,后来又将原先的代码加了输入外挂,然后在 C++ 里面就过了。

My Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 502;
int a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN], rnd[MAXN], sum1[MAXN], sum2[MAXN], sum3[MAXN];
int Scan()///输入外挂
{
int res=0,ch,flag=0;
if((ch=getchar())=='-') flag=1;
else if(ch>='0'&&ch<='9')
res=ch-'0';
while((ch=getchar())>='0'&&ch<='9')
res=res*10+ch-'0';
return flag?-res:res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++) for(int j=0; j<n; j++) a[i][j] = Scan();
for(int i=0; i<n; i++) for(int j=0; j<n; j++) b[i][j] = Scan();
for(int i=0; i<n; i++) for(int j=0; j<n; j++) c[i][j] = Scan();
for(int i=0; i<n; i++) rnd[i] = rand()%17;
for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum1[i] += a[j][i]*rnd[j];
for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum2[i] += b[j][i]*sum1[j];
for(int i=0; i<n; i++) for(int j=0; j<n; j++) sum3[i] += c[j][i]*rnd[j];
int ok = 1;
for(int i=0; i<n; i++) if(sum3[i] != sum2[i]) {ok = 0; break;}
if(ok)  puts("Yes");
else    puts("No");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: