zoukankan      html  css  js  c++  java
  • 计算矩阵连乘

    #include <cstdio>
    #include <cstdlib>
    //#define _OJ_
    #define maxsize 100
    
    typedef struct matrix
    {
        int row;
        int colum;
    } matrix;
    
    typedef struct stack1
    {
        int top;
        int base;;
        char *elem;
    } stack1, *stack;
    
    stack
    creat_stack(void)
    {
        stack s;
        s = (stack) malloc (sizeof(stack1));
        s->elem = (char*) malloc (sizeof(char) * maxsize);
        s->top = s->base  = 0;
        return s;
    }
    
    
    void
    push(stack s, char data)
    {
        s->elem[s->top++] = data;
    }
    
    char
    pop(stack s)
    {
        return s->elem[--s->top];
    }
    
    int
    isempty(stack s)
    {
        if(s->top == s->base)
            return 1;
        else
            return 0;
    }
    
    char
    get_top(stack s)
    {
        return s->elem[s->top - 1];
    }
    
    // ----------------------------------------------------------------------------------------
    
    // matrix
    // operater(matrix M, matrix T)
    // {
    
    // }
    
    int
    num_multi(stack s, char *str, matrix *M)
    {
    
        int sum = 0, i = 0;
        char ch1;
        while (str[i] != '') {
            // printf("%c
    ", str[i]);
          if(isempty(s))               push(s, str[i]);
          else if(str[i] == '(')       push(s, str[i]);
          else if('A' <= str[i] && str[i] <= 'Z') {
               if('A' <= get_top(s) && get_top(s) <= 'Z') {
            if(M[str[i] - 'A'].row != M[get_top(s) - 'A'].colum)      return -1;
            sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[str[i] - 'A'].colum;
            M[get_top(s) - 'A'].colum = M[str[i] - 'A'].colum;
          }
          else
            push(s, str[i]);
        }
    
        else if(str[i] == ')') {
           ch1 = pop(s);           pop(s);
           if(isempty(s))          push(s, ch1);
           else {
           if(M[ch1 - 'A'].row != M[get_top(s) - 'A'].colum)      return -1;
           sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[ch1 - 'A'].colum;
           M[get_top(s) - 'A'].colum = M[ch1 - 'A'].colum;
           }
        }
        // printf("sum = =%d
    ", sum);
        i++;
      }
    
        return sum;
    }
    
    
    
    int main(int argc, char const *argv[]) {
    #ifndef _OJ_  //ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif
    
        int result, row1, colum1, T, i, j, n1, n2;
        char str[100];
        char ch;
        matrix M[26];
        stack s;
        s = creat_stack();
    
        scanf("%d", &T);    gets(str);
        while(T--) {
          scanf("%c %d %d", &ch, &row1, &colum1);
          M[ch - 'A'].row = row1;     M[ch - 'A'].colum = colum1;
          // printf("%c %d %d
    ", ch, row1, colum1);
          gets(str);
    
        }
    
        gets(str);
        result = num_multi(s, str, M);
        if(result == -1)     printf("error
    ");
        else printf("%d
    ", result);
    
        return 0;
    }
    
    
    /*给定n个矩阵{A1,A2,...,An},考察这n个矩阵的连乘积A1A2...An。由于矩阵乘法满足结合律,
    故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。
    矩阵连乘积的计算次序与其计算量有密切关系。
    例如,考察计算3个矩阵{A1,A2,A3}连乘积的例子。
    设这3个矩阵的维数分别为10*100,100*5,和5*50。若按(A1A2)A3计算,
    3个矩阵连乘积需要的数乘次数为10*100*5+10*5*50 = 7500。若按A1(A2A3)计算,
    则总共需要100*5*50+10*100*50 = 75000次数乘。
    现在你的任务是对于一个确定的矩阵连乘方案,计算其需要的数乘次数。
    输入
    输入数据由多组数据组成。每组数据格式如下:
    第一行是一个整数n (1≤n≤26),表示矩阵的个数。
    接下来n行,每行有一个大写字母,表示矩阵的名字,后面有两个整数a,b,分别表示该矩阵的行数和列数
    ,其中1<a,b<100。
    第n+1行是一个矩阵连乘的表达式,由括号与大写字母组成,没有乘号与多余的空格。
    如果表达式中没有括号则按照从左到右的顺序计算,输入的括号保证能够配对。
    输出
    对于每组数据,输出仅一行包含一个整数,即将该矩阵连乘方案需要的数乘次数。
    如果运算过程中出现不满足矩阵乘法法则的情况(即左矩阵列数与右矩阵的行数不同),
    则输出“error”。
    
    样例输入
    3
    A 10 100
    B 100 5
    C 5 50
    A(BC)
    样例输出
    75000*/
    

      --------------------------------------------------------------------------------------------------------------------------------------

    5
    A 10 100
    B 100 5
    C 5 50
    D 50 2
    E 2 100
    A(B(C(D(E))))

    -------------

    185000;;;;;

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/airfand/p/5027505.html
Copyright © 2011-2022 走看看