442 - Matrix Chain Multiplication

欢迎folk或者star我的repo:https://github.com/guopeiming/algorithm-training,每天更新一道oj入门紫皮书上的题目或者oj、LeetCode,持续更新中

主要就是模拟矩阵的计算过程,注意每一次栈都要清空,否则,上一次残留的东西会影响后一次的计算。
整个的计算过程就类似前、后、中缀表达式的计算过程,很类似计算器,比较简单的水题
#include <stdio.h>
#include <stack>
#include <string.h>
using namespace std;

void mul();

int mat[60], n;
stack<int> s;
char str[200];

int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i){
        getchar();
        char name;
        scanf("%c", &name);
        scanf("%d %d", mat+2*(name-'A'), mat+2*(name-'A')+1);
    }
    while(~scanf("%s", str)){
        mul();
        while(!s.empty()){
            s.pop();
        }
    }
    return 0;
}
void mul(){
    int res = 0;
    for(int i = 0; i < strlen(str); ++i){
        if(str[i] == '('){
            continue;
        }else if(str[i] == ')'){
            int matSize[4];
            for(int j = 3; j >= 0; --j){
                matSize[j] = s.top();
                s.pop();
            }
            if(matSize[1] != matSize[2]){
                printf("error\n");
                return;
            }else{
                res += matSize[0]*matSize[1]*matSize[3];
                s.push(matSize[0]);
                s.push(matSize[3]);
            }
        }else{
            s.push(mat[(str[i]-'A')*2]);
            s.push(mat[(str[i]-'A')*2+1]);
        }
    }
    printf("%d\n", res);
}
// Sample Input
// 9
// A 50 10
// B 10 20
// C 20 5
// D 30 35
// E 35 15
// F 15 5
// G 5 10
// H 10 20
// I 20 25
// A
// B
// C
// (AA)
// (AB)
// (AC)
// (A(BC))
// ((AB)C)
// (((((DE)F)G)H)I)
// (D(E(F(G(HI)))))
// ((D(EF))((GH)I))

// Sample Output
// 0
// 0
// 0
// error
// 10000
// error
// 3500
// 15000
// 40500
// 47500
// 15125

//数据结构栈的使用
//牢记每次计算之前栈一定要先清空
posted @ 2019-09-22 08:44  回溯法  阅读(186)  评论(0编辑  收藏  举报