PM3(矩阵相乘 行和的简便运算)
来源:互联网 发布:海洋cms模板怎么用 编辑:程序博客网 时间:2024/04/30 14:49
http://poj.org/problem?id=3213
Description
USTC has recently developed the Parallel Matrix Multiplication Machine – PM3, which is used for very large matrix multiplication.
Given two matrices A and B, where A is an N × P matrix and B is a P × M matrix, PM3 can compute matrix C = AB in O(P(N + P + M)) time. However the developers of PM3 soon discovered a small problem: there is a small chance that PM3 makes a mistake, and whenever a mistake occurs, the resultant matrix Cwill contain exactly one incorrect element.
The developers come up with a natural remedy. After PM3 gives the matrix C, they check and correct it. They think it is a simple task, because there will be at most one incorrect element.
So you are to write a program to check and correct the result computed by PM3.
Input
The first line of the input three integers N, P and M (0 < N, P, M ≤ 1,000), which indicate the dimensions of A and B. Then follow N lines with P integers each, giving the elements of A in row-major order. After that the elements of B and C are given in the same manner.
Elements of A and B are bounded by 1,000 in absolute values which those of C are bounded by 2,000,000,000.
Output
If C contains no incorrect element, print “Yes
”. Otherwise print “No
” followed by two more lines, with two integers r and c on the first one, and another integer von the second one, which indicates the element of C at row r, column c should be corrected to v.
Sample Input
2 3 21 2 -13 -1 0-1 00 21 3-2 -1-3 -2
Sample Output
No1 21
Hint
The test set contains large-size input. Iostream objects in C++ or Scanner in Java might lead to efficiency problems.
题意:判断A、B两矩阵相乘的结果C矩阵中是否有唯一错的那个数字,如果没有,输出yes,,否则输出no,并输出错误数字位置和正确答案。
题解:由于有且只有一个位置有错,则可以简化为求出相乘后的矩阵的行和与C比较,若不相同,则找出了有错的行,然后在逐个比较找出错误的位置。技巧就在求行和的时候,矩阵的对应相乘后的行和等于A的某一行的数字分别乘以B的某一行之和,最后求和。 输入矩阵也可以只用一个循环:%s,a[i];
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<queue>#include<cstdlib>#include<string>#define maxn 1010using namespace std;int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];int bcol[maxn],ccol[maxn];int main(){ int m,n,p; int fg=0,f1=0,f2=0,ans; scanf("%d %d %d",&n,&p,&m); for(int i=0;i<n;i++) for(int j=0; j<p; j++) scanf("%d",&a[i][j]); for(int i=0;i<p;i++) for(int j=0; j<m; j++) scanf("%d",&b[i][j]); for(int i=0;i<n;i++) for(int j=0; j<m; j++) scanf("%d",&c[i][j]); for(int i=0;i<p;i++) { bcol[i]=0; for(int j=0;j<m;j++) bcol[i]+=b[i][j]; } for(int i=0;i<n;i++) { ccol[i]=0; for(int j=0;j<m;j++) ccol[i]+=c[i][j]; } for(int i=0;i<n;i++) { int temp=0; for(int j=0;j<p;j++) temp+=a[i][j]*bcol[j]; if(temp!=ccol[i]) { fg=1; f1=i; break; } } if(!fg) puts("Yes"); else { for(int i=0;i<m;i++) { int cnt=0; for(int j=0;j<p;j++) { cnt+=a[f1][j]*b[j][i]; } if(c[f1][i]!=cnt) { f2=i; ans=cnt; break; } } puts("No"); printf("%d %d\n",f1+1,f2+1); printf("%d\n",ans); } return 0;}
- PM3(矩阵相乘 行和的简便运算)
- 求矩阵的转置矩阵和两个矩阵相乘
- CULA矩阵相乘和CUBLAS矩阵相乘
- 两个矩阵的相加和相乘
- 稀疏矩阵三元组的相加相乘运算
- 稀疏矩阵的运算(相乘,输出,转置,相加)
- java 矩阵相乘,矩阵线性运算
- POJ 3213 PM3 矩阵乘法
- 矩阵相乘的算法
- 矩阵相乘的算法
- 矩阵的相乘
- 矩阵相乘的优化
- 矩阵的逐个相乘
- 矩阵相乘的本质
- Blitz++ 矩阵相乘(张量运算) 示例
- D3D、OpenGL顶点和矩阵的相乘和存储:
- PM3
- 二维矩阵相乘的串行和并行实现
- UART0串口编程系列 串口(UART0)之UC/OS(二)
- hadoop的编程实例
- 仿QQ侧滑删除(简陋版)
- uiwebview加载html页面调用相册、拍照无法选择的问题
- php----5建立文件夹
- PM3(矩阵相乘 行和的简便运算)
- [javase学习笔记]-2.4 常量
- void 和 Void
- centos 5.9安装mysql5.7.9 +gcc编译升级
- Blur detection with OpenCV
- PC机与嵌入式开发板相互传输数据
- saltstack一些简单的总结--关于几个简单的任务(4)
- LintCode 比较字符串
- cocos2d-x 3.x相应键盘事件