首页 > 其他分享 >UVA 442 Matrix Chain Multiplication

UVA 442 Matrix Chain Multiplication

时间:2022-12-20 21:12:46浏览次数:59  
标签:Matrix int 矩阵 times mp Multiplication UVA include 乘法

原题Vjudge

题目大意

模拟矩阵链乘的计算,如果出现错误就输出error,否则输出总共的乘法次数
对于一个矩阵\(A(m \times n), B(n \times p)\) 乘法次数为\(m\times n \times p\)

解题思路

这道题目就是经典的表达式模拟,对于一个矩阵的处理,我们可以用map把一个矩阵的名字(字母)映射到一个\(pair,\ pair\)的\(first\)代表矩阵的行数,\(second\)代表矩阵的列数
\(map\)<\(char\), \(pair\)<\(int, int\)> > \(mp\)
就这样处理就好惹

表达式运算规则

遇到字母就把它的行列入栈(栈的类型是\(stack\)<\(pari\)<\(int, int\)>>)
遇到右括号就把栈顶的两个字母都出栈,然后计算这两个矩阵相乘的结果,重新压入栈
这时候可能会问了,这样不会改变矩阵相乘的顺序吗
会,但是没关系,因为矩阵乘法满足结合律,而我们只要求最后的结果
最后别忘记了,矩阵\(A(m \times n), B(n \times p)\)相乘时,如果\(A\)的列数不等于\(B\)的行数
要输出error

坑点

矩阵乘法不满足交换律
先取出来的应该是后面进去的
如果我们要进行矩阵\(A \times B\)运算,从栈中是先取出\(B\)再取出\(A\)的

P.S.

UVa难得有一道输入挺舒服的题

解题代码

#include <iostream>
#include <cstring>
#include <map>
#include <stack>

#define x first
#define y second

using namespace std;

int n, a, b;
char ch;
map<char, pair<int, int> > mp;

int calc(string s) 
{
    int ans = 0, err = 0;
    stack<pair<int, int> > S;
    
    for (auto c : s) 
    {
        if (isalpha(c)) S.push({mp[c].x, mp[c].y});
        if (c == ')') 
        {
            auto p = S.top(); S.pop();
            auto q = S.top(); S.pop();
            if (q.y != p.x) { err = 1; break ; }
            ans += q.x * q.y * p.y;
            S.push({q.x, p.y});
        }
    }
    
    return err ? -1 : ans;
}

int main()
{
    scanf("%d", &n);
    
    while (n -- ) 
    {
        scanf(" %c%d%d", &ch, &a, &b);
        mp[ch] = {a, b};
    }
    string s;
    while (cin >> s) 
    {
        int res = calc(s);
        if (~res) printf("%d\n", res);
        else puts("error");
    }
    
    return 0;
}

标签:Matrix,int,矩阵,times,mp,Multiplication,UVA,include,乘法
From: https://www.cnblogs.com/StkOvflow/p/16995087.html

相关文章

  • UVA 514-Rails
    原题Vjudge题目大意给定一个入栈序列\([1,2,3....,n]\),判断出栈序列\([a_{1},a_{2}.....a_{n}]\)是否合法解题思路这道题目我们可以用一个栈与双指针结合的算法我们设......
  • UVA1615 高速公路 Highway
    #include<iostream>#include<cmath>#include<algorithm>#include<cstdio>usingnamespacestd;typedeflonglongll;typedefdoubledb;constdbeps=1e-4......
  • UVA1398 Meteor
    每颗流星经过框的时间用一个左开右开的开区间来表示,然后就是简单的求最大区间覆盖问题了。其中求开区间的方法很巧妙,可以节省一些代码量。#include<iostream>#include......
  • UVA1343 旋转游戏 The Rotation Game
    #include<iostream>#include<string>#include<algorithm>#include<cstring>usingnamespacestd;constintread[25][2]={ {0,0}, {1,3},......
  • WebGL之Matrix4库
    1.Matrix4是由<<WebGL编程指南>>作者写的提供WebGL的4*4矩阵操作的方法库,简化我们编写的代码。源代码共享地址,点击链接:Matrix4源代码。参考:https://www.cnblogs.com/w-wa......
  • 程序设计基础实验课 单元六的题-UVA10410 TreeReconstruction 树重建
    入门指南题面:  洛谷题面:   观看的题解:https://www.cnblogs.com/jerryRey/p/4622927.html  对样例区样例画的一些图:       题目的一些争议......
  • UVALive 2038 Strategic game--树形dp
    原题链接:​​http://vjudge.net/problem/UVALive-2038​​题意:一棵树,n个点,0为根,求最少的点可以覆盖所有边。分析:dp[u][0]表示u点不选;dp[u][1]表示该点选择。#defin......
  • UVALive 4015 Caves--树形dp
    原题链接:​​http://vjudge.net/problem/UVALive-4015​​题意:n个部落,编号0到n-1,n-1条路连接n个部落,连成一棵树,机器人从树根出发,问在最多走x米最多经过多少部落。分析:dp[i......
  • UVA 10859 Placing Lampposts--树形dp
    原题链接:​​http://vjudge.net/problem/UVA-10859​​题意:给一个N个点M条边的无向无环图,就是树的意思,每个节点都可以放灯。每盏灯将照亮以它为一个端点的所有边,在所有边都......
  • poj1651 Multiplication Puzzle--区间dp
    原题链接:​​http://poj.org/problem?id=1651​​题意:给出N个数,每次从中抽出一个数(第一和最后一个不能抽),每次的得分为抽出的数与相邻两个数的乘积,直到只剩下首尾两个数为......