lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 题目

读题

HJ70 矩阵乘法计算量估算

 

 

考查点

 

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());
    }
}

 

3. 总结

posted on 2023-07-28 17:00  白露~  阅读(63)  评论(0编辑  收藏  举报