• 计算矩阵连乘


    #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;;;;;

  • 相关阅读:
    CF1480
    网络编程中常见地址结构与转换(IPv4/IPv6)
    inet_pton, inet_ntop
    mktime 夏令时
    C/C++中volatile关键字详解
    STL之vector容器详解
    Linux学习--gdb调试
    Linux编程基础——GDB(设置断点)
    FTP模式简式:PORT/PASV/EPRT/EPSV
    strchr和strstr 函数
  • 原文地址:https://www.cnblogs.com/airfand/p/5027505.html
Copyright © 2020-2023  润新知