矩阵相乘问题
2015-05-23 15:23
197 查看
矩阵乘法(二维数组) Time Limit: 1800/600 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 633 Accepted Submission(s): 175 Description 天才少女Alice,哦,不,应该叫天才幼儿才对,她才1岁7个月,就开始学习线性代数了。她很快就掌握了矩阵加法、减法,马上又学乘法。 矩阵乘法是这样定义的: 一个m行n列的矩阵A 与 一个n行p列的矩阵B 的乘积,是一个m行p列的矩阵C。 C的第i行第j个元素是这样算出来的: C(i,j) = A(i,1)*B(1,j) + A(i,2)*B(2,j) + ... + A(i,k)*B(k,j) + ... + A(i,n)*B(n,j) 即,C的第i行第j个元素,是由A的第i行与B的第j列的元素相应做乘法,最后求和所得。 矩阵A与矩阵B可以做乘法的前提是:A的列数等于B的行数。 对于m、n、p比较小的情况,Alice很快就能计算完毕。算出来的结果如果没有错,那么就会嚷嚷着要奖励吃蛋糕。并且常常以做矩阵乘法为理由,向爸爸索要蛋糕吃。坏坏的爸爸于是出了一些矩阵让Alice做,但m、n、p的值可能很大( 1 ≤ m、n、p ≤ 300 ),那么Alice就没有那么快计算完了。 Alice一看那么大的矩阵,立刻傻眼了,心想:算一个礼拜也算不完啊。。。。于是,狡猾的Alice又用水汪汪的大眼睛向你发出哀求的目光。请大哥哥/大姐姐快点编个程序帮Alice算出来吧。 Input 输入的第一行是三个数m、n、p ( 1 ≤ m、n、p ≤ 300 ),接下来的m行每行是n个空格分隔的整数,组成一个m*n的矩阵A。 接下来是n行,每行是p个空格分隔的整数,组成一个n*p的矩阵B。 Output 输出 A*B的积矩阵C :m行,每行p个整数(空格分隔)。C的元素不超unsigned long的表示范围。 Sample Input 3 3 2 7 5 0 0 2 1 1 3 0 1 1 0 1 19 23 Sample Output 7 12 19 25 1 4 Author John
代码:
//import java.util.Arrays; import java.util.Scanner; public class oj1099 { public static void main(String args[]) { Scanner in=new Scanner(System.in); int m=in.nextInt(); int n=in.nextInt(); int p=in.nextInt(); int a[][] =new int[m] ; int b[][] =new int [p]; for(int i=0;i<m;i++)//矩阵a for(int j=0;j<n;j++) { a[i][j]=in.nextInt(); /*if(j%n==0) { System.out.print("\n"); }*/ } for(int u=0;u<n;u++)//矩阵b for(int v=0;v<p;v++) { b[u][v]=in.nextInt(); /*if(v%p==0) { System.out.print("\n"); }*/ } /*int c[][]=new int [p]; * for(int e=0;e<n;e++)//求矩阵c 自己想的 for(int f=0;f<p;f++) { int result=0; for(int x=0;x<n;x++) { for(int y=0;y<n;y++) { c[e][f]=result+a[e][x]*b[x][f]; } } }*/ int r[][]=new int [p]; for(int e=0;e<n;e++)//求矩阵c 自己想的改错方法 for(int f=0;f<p;f++) { r[e][f]=0; for(int x=0;x<n;x++) { r[e][f]=r[e][f]+a[e][x]*b[x][f]; } } /*int r[][]=new int [p];//自己根据网上想出来的! for(int i=0;i<n;++i) { for(int j=0;j<p;++j) { //每一个r[i][j]的运算: r[i][j]=0;//初始化 for(int k=0;k<m;++k) r[i][j]+=a[i][k]*b[k][j]; } }*/ /*int[][] r = new int[a[0].length][b[0].length];//网上做法 for(int i=0;i<r.length;++i) { for(int j=0;j<r[i].length;++j) { //每一个r[i][j]的运算: r[i][j]=0;//初始化 for(int k=0;k<b.length;++k) r[i][j]+=a[i][k]*b[k][j]; } }*/ //输出结果 /*for(int i=0;i<r.length;++i) System.out.println(Arrays.toString(r[i]));*/ for(int g=0;g<n;g++)//输出 for(int h=0;h<p;h++) { System.out.print(r[g][h]+" "); if((h+1)%p==0) { System.out.print("\n"); } } } }
这么一道题目。对自己熟悉java代码有一定作用。这是学校OJ网1099题目。
相关文章推荐
- 矩阵相乘问题 算法导论动态规划P197
- dp方法论——由矩阵相乘问题学习dp解题思路
- 荷兰国旗问题、矩阵相乘之Strassen算法
- 两个矩阵相乘问题
- 杭电1575问题 矩阵相乘问题
- 动态规划经典问题——求矩阵相乘的最佳顺序
- 矩阵相乘问题
- c++矩阵相乘的初始值问题
- 石子合并问题--直线版(矩阵相乘)
- 算法笔记_003:矩阵相乘问题【分治法】
- 动态规划之矩阵连乘问题的两个矩阵相乘
- Java实现用传统分治法解决矩阵相乘问题
- 矩阵相乘顺序问题
- 矩阵相乘问题
- 矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...
- 0010算法笔记——【动态规划】矩阵连乘问题
- 51nod 1084 矩阵取数问题 V2(dp)
- 51nod-矩阵取数问题-【动态规划】
- 【线性代数】矩阵相乘
- 1083 矩阵取数问题 分类: 51nod 2015-07-20 22:05 9人阅读 评