POJ3318 Matrix Multiplication ( 随机化 + 矩阵乘法)
2017-09-22 19:53
295 查看
POJ3318 Matrix Multiplication
原题地址:http://poj.org/problem?id=3318题意:
给定 n x n 的矩阵 A,B,C,问 A * B = C 是否成立?
由于数据组数较低,所以 O(n^3)会TLE。
数据范围
A[i][j],B[i][j]<=100, C[i][j]<=10,000,000
题解:
因为O(n^3)会TLE所以不能直接矩阵乘法,因此,在这里随机生成一个n*1的矩阵r,如果 A * B = C,必然有 A (B r) =C * r
A,B,C,与r相乘都是O(n^2)的。这时只需比对A (B r) 与C * r,如果不同则A * B = C 肯定成立,相同则可能成立,我们只需要在时间允许的范围内尽可能的多次比对,来降低错误率。
代码:
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<ctime> using namespace std; const int N=505; int n,a ,b ,c ,r ,x ,y ; bool check() { for(int i=1;i<=n;i++) r[i]=rand()%97+1; memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) y[i]+=b[i][j]*r[j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) x[i]+=a[i][j]*y[j]; memset(y,0,sizeof(y)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) y[i]+=c[i][j]*r[j]; for(int i=1;i<=n;i++) if(x[i]!=y[i]) return 0; return 1; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&b[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&c[i][j]); int k=1; bool flag=0; for(;k<=60;k++) if(!check()) {flag=1; break;} if(flag) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- bzoj2396: 神奇的矩阵(矩阵乘法+随机化)
- 矩阵乘法优化--poj3318 随机矩阵
- [随机化 矩阵乘法] BZOJ 2396 神奇的矩阵 & 51Nod 1140 矩阵相乘结果的判断 & POJ 3318 Matrix Multiplication
- 矩阵乘法总结
- 图像处理C++基础 02 ——使用读写文件的矩阵乘法
- bzoj2326 数学作业 矩阵乘法
- BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法
- MapReduce的矩阵乘法的原理
- zoj3497(经典矩阵乘法)
- HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)
- 矩阵乘法
- 软件设计师1991年下午试题2(C语言 压缩矩阵乘法)
- 算法导论15章 动态规划之矩阵链乘法问题
- 理解矩阵乘法
- 向MapReduce转换:通过部分成绩计算矩阵乘法
- 矩阵乘法
- POJ 3735 Training little cats(矩阵乘法)
- 矩阵乘法
- [CODEVS 3147] 矩阵乘法 2
- 基础练习 矩阵乘法