22.矩阵链乘(UVa442)

本文介绍了一种计算矩阵链乘法次数的算法,通过输入矩阵的维度和链乘表达式,输出乘法的总次数。文章详细解释了算法的实现过程,包括如何使用栈结构存储和处理矩阵,以及如何判断矩阵乘法是否合法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

输入n个矩阵的维度和一些矩阵的链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。假定A是mn矩阵,B是np的矩阵,那么AB是mp的矩阵,乘法次数为mnp。如果A的列数不等于B的行数,则乘法无法进行。
例如,A是5010的,B是1020的,C是205的,则(A(BC))的乘法次数为10205(BC的乘法次数)+5010*5=3500.

输入:
3
A 50 10
B 10 20
C 20 5
(A(BC))

输出:
3500

解决:

#include<cstdio>
#include<iostream>
#include<stack>
#include<string>

using namespace std;

struct Matrix
{
	int a, b;
	Matrix(int a = 0, int b = 0) :a(a), b(b) {}
}m[26];

stack<Matrix> s;

int main()
{
	int i, n;	
	cin >> n; // 
	for (i = 0; i<n; i++)
	{
		string name;
		cin >> name;
		int k = name[0] - 'A';
		// 根据字母到A的距离,来存储矩阵数据,存储顺序不重要,关键是后面能索引回来
		cin >> m[k].a >> m[k].b;
	}


	string expr;
	int len;
	while (cin >> expr)
	{
		int len = expr.length();
		bool error = false;
		int ans = 0;
		for (int i = 0; i < len; i++) {
			//索引回来,放入栈s
			if (isalpha(expr[i])) s.push(m[expr[i] - 'A']);
			else if (expr[i] == ')') // 遇到‘)’,开始计算最后入栈的两个矩阵
			{
				Matrix m2 = s.top(); s.pop(); // top 并 pop掉 
				Matrix m1 = s.top(); s.pop(); // top 并 pop掉 
				if (m1.b != m2.a)
				{
					error = true;  // 不符合矩阵乘法规则
					break;
				}
				ans += m1.a * m1.b * m2.b;
				s.push(Matrix(m1.a, m2.b)); // 计算出新的矩阵,并入栈s
			}
		}
		if (error) printf("error\n");
		else printf("%d\n", ans);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值