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:
给出三个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; }
相关文章推荐
- [随机化 矩阵乘法] BZOJ 2396 神奇的矩阵 & 51Nod 1140 矩阵相乘结果的判断 & POJ 3318 Matrix Multiplication
- 51nod 1140 矩阵相乘结果的判断
- 51nod 1140 矩阵相乘结果的判断
- 51nod 1140 矩阵相乘结果的判断
- 51Nod-1140-矩阵相乘结果的判断
- 51nod-1140-矩阵相乘结果的判断
- 51nod oj 1140 矩阵相乘结果的判断【矩阵的结合律】
- 矩阵相乘结果的判断
- 51nod 1140 矩阵相乘结果的判断(矩阵结合律)
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 科普:矩阵乘法是怎么做的?怎么判断两个矩阵是否可以相乘?不使用行列式
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 两数相乘结果溢出的判断
- 编写一个程序用于执行矩阵的乘法。 m1是一个x行y列的矩阵,m2是y行z列的矩阵。 这两个矩阵应该相乘,结果存储在r中,它是x行z列的矩阵。
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 将对称矩阵压缩存储,实现矩阵相乘,输出相乘后结果(用二维数组)
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果