题目描述:

  输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。

Sample Input

9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))

Sample Output

0
0
0
error
10000
error
3500
15000
40500
47500
15125 【题目分析】   用一个栈来完成:遇到字母时入栈,遇到右括号时出栈并计算,然后出栈输出结果。
  矩阵链乘规则:
    A是50*10的,B是10*20的,C是20*5的,则(A(BC))的乘法次数为10*20*5(BC的乘法次数) + 50*10*5((A(BC))的乘法次数) = 3500。 【代码】
 
 #include<cstdio>
#include<stack>
#include<iostream>
#include<string>
using namespace std; //定义结构体
struct Matrix {
int a,b;
//构造函数
Matrix(int a = , int b = ) : a(a),b(b){}
} m[];//声明Matrix实例 //定义栈
stack<Matrix> s; int main(){ //输入矩阵名和其维度
int n;
cin >> n;
for(int i = ; i < n;i++)
{
string name;
cin >> name;
int k = name[] - 'A';//计算元素与'A'阿斯卡码值的差
cin >> m[k].a >> m[k].b;//通过预定义的结构体,获得输入的矩阵维度
} //输入矩阵链乘表达式
string expr;
while(cin >> expr)
{
int len = expr.length();
bool error = false;
int ans = ;
for(int i = ; i < len; i++){
if(isalpha(expr[i])) s.push(m[expr[i] - 'A']);//判断当前元素是否为字母,则将其对应的矩阵维度压入栈
else if(expr[i] == ')'){
//取出栈顶元素后,并删除
Matrix m2 = s.top(); s.pop();
Matrix m1 = s.top(); s.pop();
if(m1.b != m2.a){error = true; break;}//判断是否符合链乘规则
ans += m1.a * m1.b * m2.b;
s.push(Matrix(m1.a,m2.b));
//链乘规则: A,B,C; (A(BC)) = A(BC) + BC;
}
}
if(error) printf("error\n"); else printf("%d\n",ans);
}
return ;
}
【总结】
  1.结构体:
    自定义数据类型
 /*在c++中struct和类的区别在于struct不能有方法,所有成员是public的*/
struct Movie/*可以指定类型名也可以不指定*/
{
//成员都是public
int ID;
string Name;
} movie; //可以在声明struct的时候声明一个struct实例

   2.构造函数:

 //每一个对象必须要有相应的构造函数
//若没有显示定义构造函数,系统默认缺省的构造函数。
class A{
float x,y;
public:
A() {} //隐含的缺省的构造函数
void Print(void) {cout << x << "\n" << y <<endl;}
};
//只允许这样定义对象
A a1,a2;

  

   3.C++类构造函数初始化列表

 class CExample {
public:
int a;
float b;
//构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
//显示的初始化类的成员
//构造函数初始化列表
CExample(): a(),b(8.8)
{} //对类的成员赋值,并没有进行显式的初始化
//构造函数内部赋值
CExample()
{
a=;
b=8.8;
}
};

   4. using namespace std;

     std 是一个命名空间不同的命名空间可以有相同的类名被定义。

    比如A B两个班都有叫张三的人,你要使用A班的张三,必然要先指名是A班这个名字空间(namespace),然后你对张三的所有命令才能达到你的预想,不会叫错人 。



  

【UVa-442】矩阵链乘——简单栈练习的更多相关文章

  1. UVa 442 矩阵链乘(栈)

    Input Specification Input consists of two parts: a list of matrices and a list of expressions. The f ...

  2. UVa 442 Matrix Chain Multiplication(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...

  3. UVA - 442 Matrix Chain Multiplication(栈模拟水题+专治自闭)

    题目: 给出一串表示矩阵相乘的字符串,问这字符串中的矩阵相乘中所有元素相乘的次数. 思路: 遍历字符串遇到字母将其表示的矩阵压入栈中,遇到‘)’就将栈中的两个矩阵弹出来,然后计算这两个矩阵的元素相乘的 ...

  4. UVa 10003 切木棍(区间DP+最优矩阵链乘)

    https://vjudge.net/problem/UVA-10003 题意: 有一根长度为L的棍子,还有n个切割点的位置.你的任务是在这些切割点的位置处把棍子切成n+1部分,使得总切割费用最小.每 ...

  5. COJ 0016 20603矩阵链乘

    传送门:http://oj.cnuschool.org.cn/oj/home/solution.htm?solutionID=35454 20603矩阵链乘 难度级别:B: 运行时间限制:1000ms ...

  6. POJ1260 Pearls(dp,矩阵链乘法)

    题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一 ...

  7. UVA 442 二十 Matrix Chain Multiplication

    Matrix Chain Multiplication Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %l ...

  8. 例题6-3 Matrix Chain Multiplication ,Uva 442

    这个题思路没有任何问题,但还是做了近三个小时,其中2个多小时调试 得到的经验有以下几点: 一定学会调试,掌握输出中间量的技巧,加强gdb调试的学习 有时候代码不对,得到的结果却是对的(之后总结以下常见 ...

  9. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

随机推荐

  1. Visual Studio 自定义控件不显示在工具箱

    工具=>选项=>Windows窗体设计器=>常规=>AutoToolBoxPopulate=>True

  2. Codeforces Round #336 (Div. 2) A. Saitama Destroys Hotel 模拟

    A. Saitama Destroys Hotel   Saitama accidentally destroyed a hotel again. To repay the hotel company ...

  3. 几个经常用到的字符串的截取(java)

    几个经常用到的字符串的截取 string str="123abc456";int i=3;1 取字符串的前i个字符   str=str.Substring(0,i); // or  ...

  4. 二分图点染色 BestCoder 1st Anniversary($) 1004 Bipartite Graph

    题目传送门 /* 二分图点染色:这题就是将点分成两个集合就可以了,点染色用dfs做, 剩下的点放到点少的集合里去 官方解答:首先二分图可以分成两类点X和Y, 完全二分图的边数就是|X|*|Y|.我们的 ...

  5. lintcode: 寻找旋转排序数组中的最小值

    寻找旋转排序数组中的最小值 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 你可以假设数组中不存在重复的 ...

  6. 欧拉工程第51题:Prime digit replacements

    题目链接 题目: 通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83. 通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到 ...

  7. Android应用的核心基础

    Android4开发入门经典 之 第二部分:Android应用的核心基础 Android应用中的组件 Application Components Android应用中最主要的组件是: 1:Activ ...

  8. JLink and JTAG等接口简介

    1.JTAG JTAG用的计算机的并口,JTAG也是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协议,如DSP.FPGA器件等. 标准的J ...

  9. phantomjs + selenium headless test

    1. 安装selenium pip install selenium 2. 安装phantomjs 如果你是Ubuntu12.04,默认安装的版本是1.4.这个会出错. 需要安装1.9.7 cd /u ...

  10. Linux 操作系统的用户和用户组管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入 系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...