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

矩阵乘法计算量估算

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

#include<iostream>
#include<vector>
#include<map>
#include<sstream>
using namespace std;
//采用深度优先遍历的递归方法
//每一层中 将最外层括号都看做是一个整体,然后从左往右依次将所有矩阵向量放入数组中,再依次相乘

map<char, pair<int, int>> table;//存储字母对应的矩阵向量
int times = 0;//总计算次数

pair<int, int> getNewMatrix(pair<int, int> A,
                            pair<int, int> B) {//两矩阵相乘的结果 每调用一次times就会增加
    int row = A.first;
    int col = B.second;
    times += row * col * A.second;
    return { row, col };
}

pair<int, int> dfs(string s, int left, int right) {//递归调用

    vector<pair<int, int>> matrixs;//当前层所有的矩阵
    for (int i = left; i <= right; i++) {
        int layer = 0;//标记括号层次

        if (isalpha(s[i])) {//若当前位是字母,就直接将其放入尾端
            matrixs.push_back(table[s[i]]);
        }
        if (s[i] == '(') {//找出最外层括号的位置
            int j = i;
            for (; j <= right; j++) {
                if (s[j] == '(')layer++;
                else if (s[j] == ')')layer--;
                if (layer == 0)break;
            }
            matrixs.push_back(dfs(s, i + 1, j - 1));//递归计算当前括号内的矩阵
            i = j;
        }
    }

    pair<int, int> matrix = matrixs[0];
    for (int i = 1; i < matrixs.size(); i++) {
        matrix = getNewMatrix(matrix, matrixs[i]);
    }

    return matrix;
}



int main() {
    int n;
    cin >> n;
    vector<pair<int, int>> inputMats;
    for (int i = 0; i < n; i++) {
        int key;
        int value;
        cin >> key >> value;
        inputMats.push_back({ key, value });
    }
    string s;
    cin >> s;

    istringstream iss(s);
    char ch;
    int index = 0;
    while (iss >> ch) {
        if (isalpha(ch)) {
            table[ch] = inputMats[index++];
        }
    }
  	//以上均为输入内容
    dfs(s, 0, s.size() - 1);

    cout << times << endl;

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务