题目描述:

  输入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. iis 重启 (三种方法)

    iis 重启 (三种方法) WINDOWS提供WEB服务的IIS有时候会出现访问过大导致网站打不开,这时重启IIS是最好的选择. 方法/步骤 1 1.界面操作 打开“控制面板”->“管理工具”- ...

  2. How to say "no"?

    How to say "no"?7招教你如何拒绝别人      Do you have a hard time saying no to others? Do you say “y ...

  3. iOS开发--沙盒路径与操作文件

    获取应用沙盒根路径: -(void)dirHome{ NSString *dirHome=NSHomeDirectory(); NSLog(@"app_home: %@",dirH ...

  4. QTableView带可编辑进度条

    main文件与上一个例子完全一致,也使用QStandardItemModel,关键是有这句:QStandardItem.setEditable(false);  继承QAbstractItemDele ...

  5. Struts2笔记——result结果类型

    result > 每个 action方法都将返回一个 String 类型的值,Struts 将根据这个值来决定响应什么结果. > 每个 Action声明都必须包含有数量足够多的 resul ...

  6. SGU 106 The equation 扩展欧几里得好题

    扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...

  7. delphi常用函数

    直接引用了 http://www.cnblogs.com/doit8791/archive/2012/05/17/2507073.html.

  8. 蓝牙接收苹果手机通知 ANCS协议分析

    蓝牙接收苹果手机通知 ANCS协议分析 转载,请注明出处:http://www.cnblogs.com/alexcai/p/4321514.html 综述 现在有许多蓝牙手表.手环都能接收苹果ipho ...

  9. Android判断网络是否已经连接

    // check all network connect, WIFI or mobile public static boolean isNetworkAvailable(final Context ...

  10. JavaScript 中 2个等号(==)和 3个等号(===)之间的区别

    JavaScript(JS)中有3个和等号(=)相关的操作符:赋值运算符(=).等于(==).恒等于(===). 赋值运算符不多说了. 这里说说等于和恒等于. ==,等于:两边值类型不同的时候,会自动 ...