华为OJ矩阵乘法计算量估算

描述

矩阵乘法的运算量与矩阵乘法的顺序强相关。


例如:

    A是一个50×10的矩阵,B是10×20的矩阵,C是20×5的矩阵

 

计算A*B*C有两种顺序:((AB)C)或者(A(BC)),前者需要计算15000次乘法,后者只需要3500次。

 

编写程序计算不同的计算顺序需要进行的乘法次数

 

 

 

 

知识点 字符串
运行时间限制 10M
内存限制 128
输入

输入多行,先输入要计算乘法的矩阵个数n,每个矩阵的行数,列数,总共2n的数,最后输入要计算的法则

3       //矩阵个数n 
50 10   //矩阵A的行数50,列数10
10 20   //矩阵B的行数10,列数20
20 5    //矩阵C的行数20,列数5
(A(BC)) //矩阵从A开始命名,A、B、C、D...以此类推,通过括号表示运算顺序
 

输出

输出需要进行的乘法次数

样例输入 3 50 10 10 20 20 5 (A(BC))
样例输出 3500
#include     
#include 
#include 
#include 
#include 
#include 

using namespace std;

struct matrix
{
	int row;
	int col;
};

void main()
{
	vector vec;
	stack sta;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		matrix tmp;
		cin >> tmp.row >> tmp.col;
		vec.push_back(tmp);
	}
	string str;
	cin >> str;
	int result = 0;
	for (int i = 0; i < str.length(); i++)
	{
		if (str[i] >= 'A'&&str[i] <= 'Z')
		{
			int index = str[i] - 'A';
			sta.push(vec[index]);
		}
		else if (str[i] == ')')
		{
			matrix value1 = sta.top();
			sta.pop();
			matrix value2 = sta.top();
			sta.pop();
			matrix value3;
			value3.row = value2.row;
			value3.col = value1.col;
			sta.push(value3);
			result += value2.row*value2.col*value1.col;
		}
	}
	cout << result;
}


你可能感兴趣的:(华为OJ)