矩阵乘法的运算量计算(华为OJ)

题目地址:
https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b?tpId=37&&tqId=21293&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

题目内容

矩阵乘法的运算量与矩阵乘法的顺序强相关。

例如:
A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵

计算ABC有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。

编写程序计算不同的计算顺序需要进行的乘法次数

输入描述:
输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则
输出描述:
输出需要进行的乘法次数
示例1
输入

3
50 10
10 20
20 5
(A(BC))
输出

3500

思路

显然用栈做。但是细节要把控好。

考虑这样的数据,代码也应该能handle:

4
50 10
10 20
20 5
5 6
(A(BCD))
输出

9000

思路:
每个字母肯定不会重复,每个字母对应到一个(r,c)元组上,弄成结构体比较方便。

将字母括号串从左到右扫描,遇到')'则弹栈,一直弹到遇到'(',那么弹出的这些字母(对应到一个个矩阵,也对应到一个包含(r,c)维度信息的结构体),它们的列数c相乘,再乘以最后弹出元素(也即紧邻'('右边的字母)的行数r。
注意,这里还没有结束,遇到了'('应该把弹出这些元素计算结果进行保存,并且,更新一下维护的字母括号序列的元素,我的做法是把原有的“(XXXXZ)”这个东西用Z来替代,因为Z的列数c后续还是会被使用。

放码过来


#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <climits>
#include <stack>

using namespace std;

void EX21_clean() {
    int n;

    struct Dim { int r, c; };

    while (cin >> n) {
        vector<Dim> vd;
        Dim dim;

        for (int i = 0; i < n; i++) {
            cin >> dim.r >> dim.c;
            vd.push_back(dim);
        }

        string s; cin >> s;
        stack<Dim> stk;
        int ans = 0;
        stack<char> cal;
        int delta;

        int idx;
        char ch1, ch2;

        for (int i = 0; i < s.length(); i++) {
            if (s[i] == ')') {
                if (cal.size() != 1) {
                    ch1 = cal.top(); cal.pop();
                    if (ch1 == '(') {
                        continue;
                    }
                    idx = ch1 - 'A';
                    dim = vd[idx];

                    delta = dim.c;
                    while (!cal.empty()) {
                        ch2 = cal.top(); cal.pop();
                        idx = ch2 - 'A';
                        if (ch2 == '(') {
                            cal.push(ch1); //注意此处
                            break;
                        }
                        dim = vd[idx];
                        delta *= dim.c;
                    }
                    delta *= dim.r;
                    ans += delta;
                }
            }
            else {
                cal.push(s[i]);
            }
        }
        cout << ans << endl;
    }
}

int main() {
    //EX1();
    //EX2();
    //EX3();
    //EX4();
    //EX5();
    //EX6();
    //EX7();

    //EX11();
    //EX12();
    //EX13();
    //EX14();
    //EX15();
    //EX16();
    //EX17();

    EX21_clean();

    return 0;
}
时间: 2024-11-08 18:28:23

矩阵乘法的运算量计算(华为OJ)的相关文章

C语言科学计算入门之矩阵乘法的相关计算_C 语言

1.矩阵相乘矩阵相乘应满足的条件: (1) 矩阵A的列数必须等于矩阵B的行数,矩阵A与矩阵B才能相乘: (2) 矩阵C的行数等于矩阵A的行数,矩阵C的列数等于矩阵B的列数: (3) 矩阵C中第i行第j列的元素等于矩阵A的第i行元素与矩阵B的第j列元素对应乘积之和,即 如: 则: 2. 常用矩阵相乘算法    用A的第i行分别和B的第j列的各个元素相乘求和,求得C的第i行j列的元素,这种算法中,B的访问是按列进行访问的,代码如下: void arymul(int a[4][5], int b[5]

矩阵乘法cache优化

好文要转,太棒了~~~~~~~~~~~~~~~~~~~~~~~~~ 题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 昨晚为了优化这个题目弄到2点多,今天一早就写博,我真是太不蛋定了,哈哈. 做OJ的朋友都知道快速幂,我就不罗嗦了,我说的主要是矩阵乘法实现层面的优化. 最开始我的代码耗时1156ms,代码如下: void  mat_mul( int (*a)[MAXN], int (*b)[MAXN],

OpenBLAS项目与矩阵乘法优化 | AI 研习社

提起矩阵计算,学过<高等数学>的人可能都听过,但若不是这个领域的研究者,恐怕也只停在"听过"的程度.在矩阵计算领域,开源项目OpenBLAS影响巨大,除IBM.华为等巨头公司在使用外,还吸引了全球的研究院校.开发者们关注. 雷锋网 AI 研习社近日有幸邀请到了澎峰科技创始人.OpenBLAS项目创始人和主要维护者张先轶,他将为我们介绍OpenBLAS开源项目以及矩阵乘法的优化. 嘉宾介绍 张先轶,中国科学院博士,MIT博士后,OpenBLAS开源项目创始人和主要维护者,Pe

Mapreduce实现矩阵乘法的算法思路

大数据计算中经常会遇到矩阵乘法计算问题,所以Mapreduce实现矩阵乘法是重要的基础知识,下文我尽量用通俗的语言描述该算法. 1.首先回顾矩阵乘法基础 矩阵A和B可以相乘的前提是,A的列数和B的行数相同,因为乘法结果的矩阵C中每一个元素Cij,是A的第i行和B的第j列做点积运算的结果,参见下图: 2.进入正题 在了解了矩阵乘法规则后,我们打算采用分布式计算模型Mapreduce来完成这一过程. MR过程是在Hadoop集群的多台机器上同时进行的,所以能MR化的计算必须是没有前后关系.相互独立的

理解矩阵乘法

大多数人在高中,或者大学低年级,都上过一门课<线性代数>.这门课其实是教矩阵. 刚学的时候,还蛮简单的,矩阵加法就是相同位置的数字加一下. 矩阵减法也类似. 矩阵乘以一个常数,就是所有位置都乘以这个数. 但是,等到矩阵乘以矩阵的时候,一切就不一样了. 这个结果是怎么算出来的? 教科书告诉你,计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3. 也就是说,结果矩阵第m行与

【算法导论】矩阵乘法

离过年都不到十天了,还要等到这周五才能回家,想想也一年没回家了.从寒假开始到现在,已经有二十来天,这期间把2014年总结中的寒假计划也大多数完成了:The Element Of Style的阅读,三门数学课<随机过程>.<工程优化>.<数值分析>的算法实现.回家过年期间肯定不会写博客了,今天一看,这个月只写了三篇,于是乎今天必须再写一篇来完成这个月的基本工作量.言归正传,这篇文章写写选修课<算法设计>作业题中的矩阵乘法的三种方法. 矩阵乘法 传统方法 理论公

MapReduce实现矩阵乘法:实现代码

编程环境: java version "1.7.0_40" Eclipse Kepler Windows7 x64 Ubuntu 12.04 LTS Hadoop2.2.0 Vmware 9.0.0 build-812388 输入数据: A矩阵存放地址:hdfs://singlehadoop:8020/workspace/dataguru/hadoopdev/week09/matrixmultiply/matrixA/matrixa A矩阵内容: 3 4 6 4 0 8 matrixa

python实现矩阵乘法的方法

  本文实例讲述了python实现矩阵乘法的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 def matrixMul(A, B): res = [[0] * len(B[0]) for i in range(len(A))] for i in range(len(A)): for j in range(len(B[0])): fo

c++-C++矩阵乘法-输入第二个矩阵数据后程序崩溃?

问题描述 C++矩阵乘法-输入第二个矩阵数据后程序崩溃? //初始化第二个矩阵的数据后程序崩溃了?为什么呢? #include using namespace std; int main() { a: int m,n,r,c; cout<<"请输入第一个矩阵的行与列"< cin>>m>>n; cout<<"请输入第二个矩阵的行与列"< cin>>r>>c; if(n!=r) { co