HDOJ 1082 Matrix Chain Multiplication
题目
分类
模拟
数据结构 栈 (zhàn)
题意
计算带括号的矩阵相乘的表达式 的 计算代价
首先我们先看
点击查看百度百科 矩阵乘法
规则
结果的第 i 行 第 j 列的元素 为 乘数矩阵的 i 行 与 被乘数矩阵 第 j 列 相乘 的 和
乘数矩阵的 列数 与 被乘数矩阵 行数 不等 不能相乘例如
![]()
题解
矩阵的计算代价
如上图 简单推出 为 乘数矩阵行数 乘以 乘数矩阵列数 乘以 被乘矩阵
学过数据结构的同学 都知道 括号表达式解析方法
其中一个很简单的方法就是 用 栈
直接举例说明
A×(B×C)
矩阵 行数 列数 A 50 10 B 10 20 C 20 5 遇到 A 将 A 压入栈
遇到 ( 跳过
遇到 B 将 B 压入栈
遇到 C 将 C 压入栈
遇到 ) 出栈得到 B 出栈得到 C 计算 得到 10 * 5 的矩阵 设为D 计算代价为 10×20×5
结尾 栈不为空 出栈得到 D 出栈得到 A 计算 得到 50 * 5 的矩阵 计算代价为 50×10×5
计算代价为 10×20×5+50×10×5=3500
代码
#include <iostream>
#include <stack>
#define max 26
using namespace std;
struct Matrix
{
int r;
int c;
/* Matrix & operator= (Matrix & t)
{
r = t.r;
c = t.c;
return *this;
}*/
Matrix & operator* (Matrix & t)
{
c = t.c;
return *this;
}
friend istream & operator >> (istream & is,Matrix & t)
{
is >> t.r >> t.c;
return is;
}
friend ostream & operator << (ostream & os,Matrix & t)
{
os << t.r << " " << t.c << endl;
return os;
}
};
Matrix m[max];
stack<Matrix> st;
int main()
{
int n,res;
bool er;
char ch;
string express;
cin >> n;
while(n--)
{
cin >> ch;
cin >> m[ch - 'A'];
}
cin.get();
while(getline(cin,express))
{
if(express.length() == 1)
{
cout << 0 << endl;
continue;
}
res = 0;
er = false;
for(int i = 0;i < express.length();i++)
{
if(express[i] == '(')
continue;
if(express[i] == ')')
{
Matrix a = st.top();
// cout << a;
st.pop();
Matrix b = st.top();
// cout << b;
st.pop();
if(a.r != b.c)
{
cout << "error" << endl;
er = true;
break;
}
res += (a.r * a.c * b.r);
Matrix c = b * a;
// cout << c << endl;
st.push(c);
continue;
}
st.push(m[express[i] - 'A']);
}
if(!er)
cout << res << endl;
while(!st.empty())
{
st.pop();
}
}
return 0;
}