解题(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-矩阵乘法计算量)的主要内容,如果未能解决你的问题,请参考以下文章

快速幂矩阵

大佬是怎么优雅实现矩阵乘法的?

队内赛 T2DP矩阵乘法快速幂网格游走

LUOGU P4159 [SCOI2009]迷路(矩阵乘法)

矩阵链乘(解析表达式)

矩阵链乘问题