Uva 442 Matrix Chain Multiplication

简介: 点击打开链接 题目意思:给定一序列的矩阵,然后对于每一个表达式求出矩阵的乘法次数 解题思路:我们可以想到利用栈的思想,如果读入的字符不是 ')' 那么我们都把它如栈,如果遇到')', 我们往回找到第一个不是左括号后面的所有矩阵然后相乘,在把结...

点击打开链接

题目意思:给定一序列的矩阵,然后对于每一个表达式求出矩阵的乘法次数

解题思路:我们可以想到利用栈的思想,如果读入的字符不是 ')' 那么我们都把它如栈,如果遇到')', 我们往回找到第一个不是左括号后面的所有矩阵然后相乘,在把结果如栈即可

注意事项:由于后面的乘法会改变值,所以我们必须开两个结构体,一个用来存放初始值,另外一个是作为计算是所用,这样就不会有错,还有这一题数据很水,如果直接考虑括号内只有两个矩阵也可以过


代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int n , sum;
char ch[100];
//结构体用来存储行数和列数
struct Matrix{
    int row;
    int col;
};

Matrix s[200];//存储输入的值
Matrix cs[200];//如果不开两个会有数据出错
stack<char>st;

//复制到另外一个结构体里面
void copy(){
    for(int i = 1 ;i <= n ; i++)
        cs[i] = s[i];
}

void solve(){
    int i = 0 , mark = 0;
    sum = 0;
    copy();
    while(ch[i]){
        //如果不是有括号就入栈
        if(ch[i] != ')')
            st.push(ch[i]);
        else{
            //建立一个临时的栈用来存储要计算的那一部分
            stack<char>temp;
            while(!temp.empty())
                temp.pop();
            //第一个左括号之前全部入栈
            while(st.top() != '('){
                temp.push(st.top());
                st.pop();
            }
            st.pop();//同时删除一个左括号
            //tempchar 表示第一个矩阵
            char tempchar;
            if(!temp.empty())
                tempchar = temp.top();
            temp.pop();
            //计算矩阵的乘法次数
            while(!temp.empty()){
                //如果两个矩阵不满足乘法就输出error
                if(cs[tempchar-64].col != cs[temp.top()-64].row){
                     printf("error\n");
                     mark = 1;
                     break;
                }
                else{
                    //这里都要对cs结构体操作,因为乘法后会改变原来的值
                    sum += cs[tempchar-64].row * cs[tempchar-64].col * cs[temp.top()-64].col;
                    cs[tempchar-64].col = cs[temp.top()-64].col;
                    temp.pop();
                }
            }
            if(mark)
                break;
            st.push(tempchar);//最后一个矩阵从新入栈
        }
        i++;
    }
    if(!mark)
        cout<<sum<<endl;
    //栈的清空
    while(!st.empty())
        st.pop();
}

//main函数实现
int main(){
    int  i;
    char c;
    cin>>n;
    getchar();
    for(i = 1 ; i <= n ; i++){
        cin>>c>>s[i].row>>s[i].col;
    }
    getchar();
    while(gets(ch)){
        //只有一个矩阵就直接输出error
        if(strlen(ch) == 1)
            cout<<0<<endl;
        else
            solve();
    }
    return 0;
}








目录
相关文章
|
消息中间件 Java API
RocketMQ事务消息, 图文、源码学习探究~
介绍 RocketMQ是阿里巴巴开源的分布式消息中间件,它是一个高性能、低延迟、可靠的消息队列系统,用于在分布式系统中进行异步通信。 从4.3.0版本开始正式支持分布式事务消息~ RocketMq事务消息支持最终一致性:在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。 原理、流程 本质上RocketMq的事务能力是基于二阶段提交来实现的 在消息发送上,将二阶段提交与本地事务绑定 本地事务执行成功,则事务消息成功,可以交由Consumer消费 本地事务执行失败,则事务消息失败,Consumer无法消费 但是,RocketMq只能保证本地事务
|
开发工具 Android开发 开发者
|
前端开发 JavaScript 数据可视化
Vue项目打包完后如何自动上传至服务器
Vue项目打包完后如何自动上传至服务器
1432 0
Vue项目打包完后如何自动上传至服务器
|
5月前
|
定位技术 开发工具 开发者
【HarmonyOS 5】桌面快捷方式功能实现详解
在移动应用开发中,如何让用户快速触达核心功能,是目前很常见的功能之一。 鸿蒙系统提供的**桌面快捷方式(Shortcuts)**功能,允许开发者为应用内常用功能创建直达入口,用户通过长按应用图标即可快速启动特定功能,大幅减少操作层级。 本文将结合地图导航场景,详细解析鸿蒙快捷方式的实现原理与开发流程。结合华为官方开源示例 DesktopShortcut 展开,该示例基于HarmonyOS 5.0实现,完整演示了地图导航场景的快捷方式开发流程。
358 0
|
6月前
|
设计模式 存储 缓存
【设计模式】【结构型模式】享元模式(Flyweight)
一、入门 什么是享元模式? 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,特别适用于存在大量相似对象的情况。 它的核心思想是将对象的内在状态(不变
247 16
|
Web App开发 移动开发 UED
介绍一下HTML5的新技能:多媒体支持
介绍一下HTML5的新技能:多媒体支持
457 2
|
8月前
|
数据采集 运维 监控
数据采集监控与告警:错误重试、日志分析与自动化运维
本文探讨了数据采集技术从“简单采集”到自动化运维的演进。传统方式因反爬策略和网络波动常导致数据丢失,而引入错误重试、日志分析与自动化告警机制可显著提升系统稳定性与时效性。正方强调健全监控体系的重要性,反方则担忧复杂化带来的成本与安全风险。未来,结合AI与大数据技术,数据采集将向智能化、全自动方向发展,实现动态调整与智能识别反爬策略,降低人工干预需求。附带的Python示例展示了如何通过代理IP、重试策略及日志记录实现高效的数据采集程序。
408 7
数据采集监控与告警:错误重试、日志分析与自动化运维
|
算法 网络安全 数据安全/隐私保护
HTTPS的性能
【10月更文挑战第23天】HTTPS的性能
277 5
|
iOS开发
iOS本地推送通知的基本使用
简单介绍iOS的本地通知推送的基本使用步骤
1487 0
|
算法 C++
模拟退火(SA)算法介绍和应用细节-附SA结合登山算法求解VRPTW问题C++代码
模拟退火(SA)算法介绍和应用细节-附SA结合登山算法求解VRPTW问题C++代码
模拟退火(SA)算法介绍和应用细节-附SA结合登山算法求解VRPTW问题C++代码