zoukankan      html  css  js  c++  java
  • zoj 1094 Matrix Chain Multiplication (好递归)

    题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094

    //题目没搞懂-_-# 原来两个expression的时候必须要有括号,说白了就是单个矩阵的时候没有括号,其他情况一定都打了括号 
    //利用递归函数expression进入每一个括号内,每一个括号内一定又包含两个expression
    
    //举个例子 ( A ( BA ) )     ( ( AB ) A )   ()//不存在这样的情况,也就是说,左括号右边要么是左括号,要么是大写字母 
     
    //分别递归进入这两个exp,如果是单个矩阵,则返回0和它的row和col(为了给它外面的exp计算),如果又是一个exp,则递归进入,并且返回乘法运算次数和结果的row和col
    //其实就相当于返回一个 matrix结构,而这个结构是expression乘法的结果
    
    //如果乘法不符合条件,则error=1
    
    #include<iostream>
    using namespace std;
    
    int n;
    struct matrix{
        int mult,row,col;
    };
    char str[100];
    bool error;
    int row[26],col[26];
    int pos;// 注意pos一定要是公有变量 
     
    //exp的定义是,单个矩阵A 或者带括号的(exp1 exp2) 
    //进入exp,pos为exp的第一个字符,如果这个字符是'('则递归进入exp1和exp2,如果pos是单个矩阵,则返回
     
    matrix expression(){//在运行完函数体后,pos会转移到右括号处 
        matrix t;
        if(str[pos] =='('){//如果是左括号
            matrix t1,t2;
            pos++;
            t1=expression();
            t2=expression();
            pos++;
            if(error||t1.col!=t2.row)
                error=1;
            else//如果乘法是合法的 
            {
                t.row=t1.row;
                t.col=t2.col;
                t.mult=t1.row*t1.col*t2.col+t1.mult+t2.mult;
            }
        }
        else{//如果是单个矩阵 
            t.row=row[str[pos]-'A'];
            t.col=col[str[pos]-'A'];
            t.mult=0;
            pos++;
        }
        return t;
    } 
                                                              
    int main(){
        matrix total;
        cin>>n;
        char matname; 
        for(int i=0;i<n;i++)
        {
            cin>>matname;
            cin>>row[matname-'A']>>col[matname-'A'];
        }
        getchar();//就因为这个卡了好久 
        while(gets(str)){
            pos=error=0;
            total=expression();
            if(error)
                cout<<"error
    ";
            else
                cout<<total.mult<<endl;
        }
        return 0;
    } 
  • 相关阅读:
    简单使用GDB
    【老人孟岩经验谈】如何学习一本新的编程语言
    【做存档】如何争取到真正有用的人脉?
    回头来看C语言里的static
    Spring MVC 教程,快速入门,深入分析[1220]
    eclipse ibabis代码生成插件abator功能扩展
    在MyEclipse中配置Tomcat服务器
    将远程调试的控制台信息输出至Eclipse
    LOG4J.PROPERTIES配置详解
    java Map 怎么遍历
  • 原文地址:https://www.cnblogs.com/neverchanje/p/3614230.html
Copyright © 2011-2022 走看看