Uva 442 Matrix Chain Multiplication

简介: 点击打开链接 题目意思:给定一序列的矩阵,然后对于每一个表达式求出矩阵的乘法次数 解题思路:我们可以想到利用栈的思想,如果读入的字符不是 ')' 那么我们都把它如栈,如果遇到')', 我们往回找到第一个不是左括号后面的所有矩阵然后相乘,在把结...

点击打开链接

题目意思:给定一序列的矩阵,然后对于每一个表达式求出矩阵的乘法次数

解题思路:我们可以想到利用栈的思想,如果读入的字符不是 ')' 那么我们都把它如栈,如果遇到')', 我们往回找到第一个不是左括号后面的所有矩阵然后相乘,在把结果如栈即可

注意事项:由于后面的乘法会改变值,所以我们必须开两个结构体,一个用来存放初始值,另外一个是作为计算是所用,这样就不会有错,还有这一题数据很水,如果直接考虑括号内只有两个矩阵也可以过


代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int n , sum;
char ch[100];
//结构体用来存储行数和列数
struct Matrix{
    int row;
    int col;
};

Matrix s[200];//存储输入的值
Matrix cs[200];//如果不开两个会有数据出错
stack<char>st;

//复制到另外一个结构体里面
void copy(){
    for(int i = 1 ;i <= n ; i++)
        cs[i] = s[i];
}

void solve(){
    int i = 0 , mark = 0;
    sum = 0;
    copy();
    while(ch[i]){
        //如果不是有括号就入栈
        if(ch[i] != ')')
            st.push(ch[i]);
        else{
            //建立一个临时的栈用来存储要计算的那一部分
            stack<char>temp;
            while(!temp.empty())
                temp.pop();
            //第一个左括号之前全部入栈
            while(st.top() != '('){
                temp.push(st.top());
                st.pop();
            }
            st.pop();//同时删除一个左括号
            //tempchar 表示第一个矩阵
            char tempchar;
            if(!temp.empty())
                tempchar = temp.top();
            temp.pop();
            //计算矩阵的乘法次数
            while(!temp.empty()){
                //如果两个矩阵不满足乘法就输出error
                if(cs[tempchar-64].col != cs[temp.top()-64].row){
                     printf("error\n");
                     mark = 1;
                     break;
                }
                else{
                    //这里都要对cs结构体操作,因为乘法后会改变原来的值
                    sum += cs[tempchar-64].row * cs[tempchar-64].col * cs[temp.top()-64].col;
                    cs[tempchar-64].col = cs[temp.top()-64].col;
                    temp.pop();
                }
            }
            if(mark)
                break;
            st.push(tempchar);//最后一个矩阵从新入栈
        }
        i++;
    }
    if(!mark)
        cout<<sum<<endl;
    //栈的清空
    while(!st.empty())
        st.pop();
}

//main函数实现
int main(){
    int  i;
    char c;
    cin>>n;
    getchar();
    for(i = 1 ; i <= n ; i++){
        cin>>c>>s[i].row>>s[i].col;
    }
    getchar();
    while(gets(ch)){
        //只有一个矩阵就直接输出error
        if(strlen(ch) == 1)
            cout<<0<<endl;
        else
            solve();
    }
    return 0;
}








目录
相关文章
uva442 Matrix Chain Multiplication
uva442 Matrix Chain Multiplication
43 0
|
存储 索引
LeetCode 73. Set Matrix Zeroes
给定一个m * n 的矩阵,如果当前元是0,则把此元素所在的行,列全部置为0. 额外要求:是否可以做到空间复杂度O(1)?
101 0
LeetCode 73. Set Matrix Zeroes
UVA442 矩阵链乘 Matrix Chain Multiplication
UVA442 矩阵链乘 Matrix Chain Multiplication