zoukankan      html  css  js  c++  java
  • POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)

    题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error。

    思路:

      参考的网站连接:http://blog.csdn.net/wangjian8006/article/details/8905295

      刚开始想到用栈的,但不知道怎么下手。后来网上查了一下,其实可以用结构体定义一个矩阵的类型,建立关于该结构体的栈,这样操作起来就方便多了。

      遇到'(',无视继续;遇到字母,压入栈顶;遇到')',将栈顶前两个矩阵压出,并加上其相乘次数,再将所得的矩阵压入栈顶;    

    这里解释这么做的原因:    

      注意看题目给出的表达式列表的形式,每两个矩阵相乘,左右必有一个括号:    

       如(AB),(A(BC))(这里B、C有一对括号,BC相乘后得到一个矩阵,该矩阵和A左右又有一对括号),(A((BC)D))    

      这样,有多少对括号(或者有几个 '(' / ')' )就要计算两个矩阵相乘多少次。因此,我们可以利用栈,一次一次往里面压入矩阵,每当遇到一个')',就计算一次相乘。

        用(A((BC)D))举例:    

      1.'(',无视继续;    

      2.A,压入栈顶,此时栈里元素:A(按进入栈的顺序,下面一样);    

      3、4.'(',同样无视;    

      5.B,压入栈顶,此时栈里元素:AB;    

      6.C,压入栈顶,此时栈里元素:ABC;    

      7.')',将栈顶的两个元素压出栈,判断,若可以相乘,则计算BC的相乘次数并加上,将BC乘后的矩阵B'压入栈顶。       此时栈里元素:AB';    

      8.D,压入栈顶,此时栈里元素:AB'D;    

      9.')',将栈顶的两个元素B'D出栈,判断,若可以相乘,则计算B'D的相乘次数并加上,将B'D乘后的矩阵B''压入栈顶。      此时栈里元素:AB''    

      10.')',将栈顶的两个元素AB''出栈,判断,若可以相乘,则计算AB''的相乘次数并加上,将AB''乘后的矩阵A'压入栈顶。       此时栈里元素:A'    

      但由于之后不会再有')',所以矩阵相乘也就结束。最后的和即为结果。    

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stack>
    
    using namespace std;
    int n,ans;
    int error; //错误标记
    int matrix[30][2]; //存储一开始给出的n个矩阵
    char str[1010]; //存储表达式列表
    
    struct Matrix{
        int row,col;
    };
    //结构体类型的栈
    stack <Matrix> s;
    //处理表达式列表
    void solve(){
        ans=0;
        Matrix tmp,t1,t2;
        int len=strlen(str);
        for(int i=0;i<len;i++){
            if(str[i]>='A' && str[i]<='Z'){       //遇到A~Z直接入栈
                tmp.row=matrix[str[i]-'A'][0];
                tmp.col=matrix[str[i]-'A'][1];
                s.push(tmp);
            }
            else if(str[i]==')'){      //遇到')',计算相乘次数
                t2=s.top();
                s.pop();
                t1=s.top();
                s.pop();
                //t1*t2
                if(t1.col!=t2.row){   //如不能计算,标记error,返回
                    error=1;
                    return;
                }
                else{
                    ans+=t1.row*t1.col*t2.col;
                    t1.col=t2.col;
                    s.push(t1);   //将相乘后的矩阵压入栈顶
                }
            }
        }
    }
    int main()
    {
        char ch;
        int r,c;
        memset(matrix,0,sizeof(matrix));
        scanf("%d",&n);
        getchar();
        for(int i=1;i<=n;i++){
            scanf("%c%d%d",&ch,&r,&c);
            matrix[ch-'A'][0]=r;
            matrix[ch-'A'][1]=c;
            getchar();
        }
        while(scanf("%s",str)!=EOF){
            error=0;
            solve();
            if(error){
                printf("error
    ");
            }
            else{
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    java基础——标准输入输出重定向,数据流
    java基础——对象流,序列化机制Serializable
    java基础——包装流
    java基础——随机访问流
    java基础——流体系,字符流和字节流基本用法
    读取 xml 文件 获取其中保存的数据信息
    批处理 获取某个文件的,特定 两列,可以修改用来做相关的操作
    写一个最简单的 Server
    对 JDBC 做一个轻量封装,待完善。。。
    从source folder 下将其所有子文件夹的*.* 文件拷贝到 target folder (不拷贝文件夹名仅拷贝文件)
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3333176.html
Copyright © 2011-2022 走看看