紫书 例6-3 矩阵相乘(Matrix Chain Multiplication, UVa 442)

    技术2025-12-03  16

    大家好,我是小黄呀。

    VJ传送门

    题目大意

    输入n个矩阵的维度和一些矩阵乘表达式,输出乘法的次数。 例如A是m*n矩阵,B是n*p矩阵,那么AB是m*p矩阵,乘法次数为m*n*p.

    思路分析

    该题是一个矩阵乘法模拟的题目,类似题目首先要构建一个Matrix结构体,然后定义相关功能的函数,这样方便题目的解答。

    具体代码

    #include<iostream> #include<stack> #include<iostream> #include<string> using namespace std; //矩阵Matrix的简单结构体 struct Matrix{ int a,b; Matrix(int a=0,int b=0):a(a),b(b) {} }m[26]; stack<Matrix> s;//存储矩阵元素的栈 int main() { int n; cin>>n; for(int i=0;i<n;i++)//输入矩阵及其行列数 { string name; cin>>name; int k = name[0]-'A'; cin>>m[k].a>>m[k].b; } string expr; while(cin>>expr)//输入运算表达式 { int len = expr.length(); bool error = false; int ans = 0; for(int i=0;i<len;i++) { if(isalpha(expr[i]))//如果是字母,入栈 s.push(m[expr[i] - 'A']); else if(expr[i]== ')')//如果是右括号,进行出栈并运算 { Matrix m2=s.top(); s.pop(); Matrix m1=s.top(); s.pop(); if(m1.b!=m2.a)//判断运算条件 { error=true; break; } ans +=m1.a*m1.b*m2.b;//计算运算次数 s.push(Matrix(m1.a,m2.b));//运算结果再次入栈 } } if(error) printf("error\n"); else printf("%d\n",ans); } return 0; }
    Processed: 0.024, SQL: 9