zoj - 1094 - Matrix Chain Multiplication
2012-12-08 14:55
323 查看
题意:输入不超过26个矩阵的行数和列数,接着来一些表达式询问,求各条表达式需要多少次基本运算。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=94
——>>用STL开2个栈,一个用来存“(”,一个用来存储矩阵,扫描表达式,当碰到矩阵时,放入矩阵栈;当碰到“(”时,放入符号栈;当碰到“)”的时候,从矩阵栈中取(退)2个矩阵相乘并记录乘法次数和,并将相乘后的矩阵放入矩阵栈,从符号栈中删除1个“(”,最后输出结果即可。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=94
——>>用STL开2个栈,一个用来存“(”,一个用来存储矩阵,扫描表达式,当碰到矩阵时,放入矩阵栈;当碰到“(”时,放入符号栈;当碰到“)”的时候,从矩阵栈中取(退)2个矩阵相乘并记录乘法次数和,并将相乘后的矩阵放入矩阵栈,从符号栈中删除1个“(”,最后输出结果即可。
#include <iostream> #include <stack> using namespace std; struct Matrix //矩阵类型,包括行数和列数 { int row; //行数 int col; //列数 }; int main() { int n, i; //n为输入的矩阵个数 Matrix mat[30]; //用来存储各个单矩阵(最多只有26个,所以开30的空间有了!!!) char c; cin>>n; for(i = 0; i < n; i++) { cin>>c; int index = (int)(c-'A'); //让矩阵数组的下标0,1,2...就标志着A,B,C... cin>>mat[index].row>>mat[index].col; //存入对应的行数和列数 } string s; //以字符串的形式输入每行测试数据 while(cin>>s) { long long sum = 0; //基本乘法数之和,初始为0 int len = s.length(); stack<char> st_sign; //该栈用来存储"(" stack<Matrix> st_node; //该栈用来存储"矩阵" int ok = 1; //ok用来标志是否出现error的现象 for(i = 0; i < len; i++) //扫描各个字符 if(s[i] == ')') //当出现")"时,必有"("与其对应 { int right_value = st_node.top().col; //从栈中取出矩阵数据,右矩阵的列数 int mid_value_right = st_node.top().row; //右矩阵的行数 st_node.pop(); int left_value = st_node.top().row; //从栈中取出矩阵数据,左矩阵的行数 int mid_value_left = st_node.top().col; //左矩阵的列数 if(mid_value_left != mid_value_right) //当 左矩阵的列数 != 右矩阵的行数 时 { ok = 0; break; } st_node.pop(); st_sign.pop(); sum += left_value * mid_value_left * right_value; //累加基本乘法次数 Matrix newmat; newmat.row = left_value; newmat.col = right_value; st_node.push(newmat); //新建一个矩阵,行数为左矩阵的行数,列数为右矩阵的列数,进栈 } else if(s[i] == '(') //碰到"("直接放入符号栈即可 st_sign.push('('); else //当扫到字母即矩阵的时候 { int new_index = (int)(s[i]-'A'); //转换下标 st_node.push(mat[new_index]); //将该矩阵放入矩阵栈 } if(ok) cout<<sum<<endl; else cout<<"error"<<endl; } return 0; }
相关文章推荐
- zoj - 1094 - Matrix Chain Multiplication
- UVa 442/HDU 1082/ZOJ 1094 Matrix Chain Multiplication(模拟&栈)
- ZOJ1094-Matrix Chain Multiplication
- zoj 1094 Matrix Chain Multiplication 栈应用
- POJ2246 HDU1082 ZOJ1094 UVA442 Matrix Chain Multiplication(矩阵相乘)
- zoj 1094 Matrix Chain Multiplication
- POJ2246 HDU1082 ZOJ1094 UVA442 Matrix Chain Multiplication题解
- zoj1094 Matrix Chain Multiplication
- UVa 442 - Matrix Chain Multiplication(zoj 1094)
- ZOJ 1094 Matrix Chain Multiplication(map函数 模拟)
- 【zoj1094-Matrix Chain Multiplication】
- zoj1094 Matrix Chain Multiplication 模拟
- ZOJ Problem Set - 1094 Matrix Chain Multiplication
- zoj1094 Matrix Chain Multiplication(模拟)
- zoj-1094-Matrix Chain Multiplication
- ZOJ 1094 Matrix Chain Multiplication
- zoj 1094 poj 2246 Matrix Chain Multiplication(堆栈)
- zoj1094-Matrix Chain Multiplication
- ZOJ-1094,POJ-2246 Matrix Chain Multiplication
- zoj-1094Matrix Chain Multiplication(栈来实现矩阵相乘)