码迷,mamicode.com
首页 > 其他好文 > 详细

解题(JuZhengCalculate-矩阵乘法计算量)

时间:2018-04-27 02:24:58      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:ann   pre   遇到   question   new   i++   次数   不同的   +=   

题目描述

矩阵乘法的运算量与矩阵乘法的顺序强相关。


例如:

    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-矩阵乘法计算量)

标签:ann   pre   遇到   question   new   i++   次数   不同的   +=   

原文地址:https://www.cnblogs.com/hzy1234/p/8955529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!