题解 | #矩阵乘法计算量估算#

矩阵乘法计算量估算

https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        Map<Character, Matrix> map = new HashMap<>();
        List<Matrix> list = new ArrayList<>();
        char name = 'A';
        for (int i = 0; i < n; i++) {
            String[] line = sc.nextLine().split(" ");
            int left = Integer.parseInt(line[0]);
            int right = Integer.parseInt(line[1]);
            map.put(name, new Matrix(left, right));
            name++;
        }
        String s = sc.nextLine();
        Result r = calMatrix(map, s);
        System.out.println(r.value);
    }
    public static Result calMatrix(Map<Character, Matrix> map, String s) {
        int resVal = 0;
        Matrix resMatrix = null;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isLetter(c)) {
                Matrix m = map.get(c);
                if (resMatrix == null) {
                    resMatrix = m;
                } else {
                    resVal = resVal + resMatrix.left * m.left * m.right;
                    resMatrix = new Matrix(resMatrix.left, m.right);
                }
            }
            if (c == '(') {
                int count = 0;
                int j = i + 1;
                for (; j < s.length(); j++) {
                    if (s.charAt(j) == '(') {
                        count++;
                    }
                    if (s.charAt(j) == ')') {
                        if (count == 0) {
                            break;
                        }
                        count--;
                    }
                }
                Result r = calMatrix(map, s.substring(i + 1, j));
                if (resMatrix == null) {
                    resVal = resVal  + r.value;
                    resMatrix = r.mx;
                } else {
                    resVal = resVal + resMatrix.left *  r.mx.left * r.mx.right + r.value;
                    resMatrix = new Matrix(resMatrix.left, r.mx.right);
                }
                i = j;
            }
        }
        return new Result(resVal, resMatrix);
    }
}
class Matrix {
    public int left;
    public int right;
    public Matrix() {}
    public Matrix(int left, int right) {
        this.left = left;
        this.right = right;
    }
}
class Result {
    public int value;
    public Matrix mx;
    public Result() {}
    public Result(int value, Matrix matrix) {
        this.value = value;
        this.mx = matrix;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:15
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务