根据题意,A矩阵(50×10)和B矩阵(10×20)满足相乘的条件,那么A×B的乘法次数为50×10×20,即: A矩阵的行 × A(B)矩阵的列(行) × B矩阵的列。
首先是输入矩阵,根据题意会输入多个矩阵,考虑使用队列(Queue)来完成输入矩阵。
这道题的重点是解析输入的计算法则,如示例中的“(A(BC))”。
考虑使用栈来完成解析,首先遍历输入法则:
1、如果读到的是 '(',不做任何操作,继续向下读。
2、如果读到的是 'A' ~ 'Z' 的字符,则入栈矩阵(从队列中弹出一个矩阵)。
3、如果读到的是 ')',则连续出栈两个矩阵,完成两个矩阵的乘法次数运算,得到一个矩阵,将得到的矩阵入栈。
代码如下:

import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int N = sc.nextInt();
            Queue<Matrix> queue = new LinkedBlockingQueue<>(); // 使用队列来保存多个矩阵,队列的特性是先进先出
            for (int i = 0; i < N; i++) {
                queue.add(new Matrix(sc.nextInt(), sc.nextInt())); // 构建矩阵,入队
            }
            String str = sc.next(); // 输入运算法则

            int count = 0; // 乘法运算次数总和
            Stack<Matrix> stack = new Stack<>();
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (c == '(') {  // 对于'(',神码也不做
                    continue;
                } else if (c == ')') { // 对于')',连续出栈两个矩阵,计算出乘法次数和结果矩阵,将计算出的结果矩阵入栈
                    if (stack.size() <= 1) { // 注意:栈中如果有1个或者0个矩阵,说明已经结束乘法次数求和,可以退出了
                        break;
                    }
                    // 注意下这里,矩阵乘法是不满***换律的,所以先出栈的是乘法的右边矩阵,后出栈的是乘法的左边矩阵
                    Matrix b = stack.pop(); // 出栈
                    Matrix a = stack.pop(); // 出栈
                    Matrix r = new Matrix(a.getX(), b.getY()); // 计算得到新的矩阵
                    stack.push(r); // 将新矩阵入栈
                    count += a.getX() * a.getY() * b.getY(); // 计算本次的乘法次数,累加
                } else {  // 对于'A'~'Z',从队列中弹出队首矩阵,入栈
                    stack.push(queue.poll());
                }
            }
            打印结果
            System.out.println(count);
        }
    }

    // 构建一个矩阵类,仅用来保存行,列信息
    private static class Matrix {
        private int x; // 行
        private int y; // 列

        public Matrix(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public int getX() {
            return x;
        }

        public int getY() {
            return y;
        }
    }
}