442 - Matrix Chain Multiplication

歡迎folk或者star個人repo:https://github.com/guopeiming/algorithm-training,天天更新一道oj入門紫皮書上的題目或者oj、LeetCode,持續更新中git

主要就是模擬矩陣的計算過程,注意每一次棧都要清空,不然,上一次殘留的東西會影響後一次的計算。
整個的計算過程就相似前、後、中綴表達式的計算過程,很相似計算器,比較簡單的水題
#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

//數據結構棧的使用
//牢記每次計算以前棧必定要先清空
相關文章
相關標籤/搜索