根据题意,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; } } }