1. 题目
读题
考查点
2. 解法
思路
代码逻辑
具体实现
import java.util.Scanner;
import java.util.Stack;
public class MatrixMultiplicationEstimation {
public static void main(String[] args) {
// 创建一个扫描器对象,用来接收用户的输入
Scanner scanner = new Scanner(System.in);
// 输入矩阵的个数
int n = scanner.nextInt();
// 创建一个二维数组,用来存储每个矩阵的行列数
int[][] input = new int[n][2];
// 循环输入每个矩阵的行列数
for (int i = 0; i < n; i++) {
input[i][0] = scanner.nextInt(); // 输入第i个矩阵的行数
input[i][1] = scanner.nextInt(); // 输入第i个矩阵的列数
}
// 输入矩阵乘法的顺序,这是一个由左右括号和大写字母组成的字符串
String order = scanner.next();
// 创建一个栈对象,用来存储字符和数字
Stack<Object> stack = new Stack<>();
// 初始化乘法次数为0
int count = 0;
// 从左到右扫描字符串
for (int i = 0; i < order.length(); i++) {
char c = order.charAt(i); // 获取当前字符
if (c == '(') { // 如果是左括号,就压入栈中
stack.push(c);
} else if (c >= 'A' && c <= 'Z') { // 如果是字母,就将对应的矩阵行列数压入栈中
stack.push(input[c - 'A'][0]); // 压入矩阵的行数
stack.push(input[c - 'A'][1]); // 压入矩阵的列数
} else if (c == ')') { // 如果是右括号,就从栈中弹出两对数,并计算它们相乘的结果和乘法次数,并将结果再压入栈中
int col2 = (int) stack.pop(); // 弹出第二个矩阵的列数
int row2 = (int) stack.pop(); // 弹出第二个矩阵的行数
stack.pop(); // 弹出左括号
int col1 = (int) stack.pop(); // 弹出第一个矩阵的列数
int row1 = (int) stack.pop(); // 弹出第一个矩阵的行数
count += row1 * col1 * col2; // 计算乘法次数,并累加到总次数中
stack.push(row1); // 将结果的行数压入栈中
stack.push(col2); // 将结果的列数压入栈中
}
}
// 输出最小的乘法次数和最终结果的行列数
System.out.println(count + " " + stack.pop() + " " + stack.pop());
}
}