HDU 1082 Matrix Chain Multiplication

题目大意:

给出一个矩阵乘法的表达式,计算需要多少次乘法运算。

思路:学过线性代数就很容易得出乘法次数就是A(row)*B(row)*B(col),也就是A的行数乘以A的行数和列数,思路本质上和表达式求值的题目是一样的,用一个栈保存矩阵信息,遇到右括号时从栈中弹出两矩阵参与运算。并将计算结果入栈。

具体实现:

(PS:这里的矩阵只存储了它的行数和列数,由于想不不到合适的名字,只好用它代替)

#include<iostream>
#include<map>
#include<cstring>
#include<stack>
using namespace std;
struct Matrix{int row; int col;};
stack<Matrix> s;
map<char,Matrix> Matrix_info; 
char Matrixexp[10000];
//ma mb分别表示两个矩阵 sum是计算次数
bool multiCount(const Matrix& Ma,const Matrix& Mb,int& count){
    //如果不能计算
    if(Ma.col!=Mb.row){
        return false;
    }else{
        count+=Ma.row*Mb.col*Mb.row;
        Matrix newMatrix={Ma.row,Mb.col};
        //将运算后的矩阵放入栈中
        s.push(newMatrix);
        return true;
    }
}
void solution()
{   int count=0;
    bool isLegal=true;
    for(int i=0;i<strlen(Matrixexp);i++){
        if(Matrixexp[i]>='A'&&Matrixexp[i]<='Z'){
            s.push(Matrix_info[Matrixexp[i]]);
        }else if(Matrixexp[i]==')'&&s.size()>=2){
            Matrix ma,mb;
            mb=s.top();
            s.pop();
            ma=s.top();
            s.pop();
            isLegal=multiCount(ma,mb,count);           
            if(!isLegal)
                break;
        }
    }
    if(isLegal)
        cout<<count<<endl;
    else
        cout<<"error"<<endl;
}
void input(){
    int n;
    cin>>n;
    while(n--){
        char Matrix_name;
        Matrix Matrix_size;
        cin>>Matrix_name>>Matrix_size.row>>Matrix_size.col;
        Matrix_info[Matrix_name]=Matrix_size;
    }
}
int main()
{
    input();
    cin.get();
    while(gets(Matrixexp)){
        solution();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值