解题(JuZhengCalculate-矩阵乘法计算量)
Posted 天地无极,乾坤剑法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解题(JuZhengCalculate-矩阵乘法计算量)相关的知识,希望对你有一定的参考价值。
题目描述
矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵
计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。
编写程序计算不同的计算顺序需要进行的乘法次数
输入描述:
输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
输出描述:
输出需要进行的乘法次数
示例1
输入
3 50 10 10 20 20 5 (A(BC))
输出
3500
代码如下:
1 package com.yzh.xuexi; 2 3 import java.util.Scanner; 4 import java.util.Stack; 5 6 public class JuZhengCalculate { 7 8 public static void main(String[] args) { 9 Scanner scanner=new Scanner(System.in); 10 while(scanner.hasNext()){ 11 int n=Integer.parseInt(scanner.nextLine()); 12 int[][] arr=new int[n][]; 13 for(int i=0;i<arr.length;i++){ 14 arr[i]=new int[2]; 15 String[] sArr=scanner.nextLine().split("\\s+"); 16 arr[i][0]=Integer.parseInt(sArr[0]); 17 arr[i][1]=Integer.parseInt(sArr[1]); 18 } 19 String rule=scanner.nextLine(); 20 System.out.println(juZhengCalculate(arr, rule)); 21 22 } 23 scanner.close(); 24 } 25 /* 26 * 用栈(依次遍历):遇到“(”直接跳过,什么也不做。遇到“字母”时就压栈,遇到“)”时就连续出两个字母(每个字母对应一个矩阵),做相应计算(累加每次乘法次数),这时会得到一个新矩阵, 27 * 用一个不重复的字母对应新矩阵并压栈。处理完最后一个“)”得到计算结果(累加值)。 28 */ 29 private static int juZhengCalculate(int[][] arr,String rule) { 30 Stack<Character> stack=new Stack<Character>(); 31 char[] cArr=rule.toCharArray(); 32 char c1,c2; 33 int number=0; 34 int[] jzArr1,jzArr2; 35 int[][] newArr=new int[26][]; 36 char newC=‘a‘; 37 for (int i = 0; i <cArr.length; i++) { 38 if (cArr[i]>=65&&cArr[i]<=90) { 39 stack.push(cArr[i]); 40 }else if (cArr[i]==‘)‘) { 41 if (stack.size()==1) { 42 return number; 43 } 44 c2=stack.pop(); 45 c1=stack.pop(); 46 if (c1>=65&&c1<=90) { 47 jzArr1=arr[c1-65]; 48 }else { 49 jzArr1=newArr[c1-97]; 50 } 51 52 if (c2>=65&&c2<=90) { 53 jzArr2=arr[c2-65]; 54 }else { 55 jzArr2=newArr[c2-97]; 56 } 57 number+=jzArr1[0]*jzArr1[1]*jzArr2[1]; 58 int[] tempArr={jzArr1[0],jzArr2[1]}; 59 newArr[newC-97]=tempArr; 60 stack.push(newC++); 61 } 62 } 63 return number; 64 65 } 66 }
3500
以上是关于解题(JuZhengCalculate-矩阵乘法计算量)的主要内容,如果未能解决你的问题,请参考以下文章