Matrix Chain Multiplication UVA - 442

题目链接

题意:输入n个矩阵的维度和一些矩阵链乘表达式,输出乘法次数。如果乘法无法进行,输出errror。假定A是m*n,B是n*p矩阵,那么AB是m*p矩阵,乘法次数为m*n*p。如果A的列数不等于B的行数,则乘法无法进行。

例如:A=50*10,B=10*20,C=20*5,则(A(BC))乘法次数为:10*20*5(BC的乘法次数)+50*10*5(A(BC)的乘法次数)=3500;


#include<stdio.h>
#include <algorithm>
#include <stack>
#include <iostream>
#include <string>
using namespace std;
struct node 
{
	int a,b;
	node(int a=0,int b=0):a(a),b(b){}
}m[26];
stack<node>S;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
	 string name;
	 cin>>name;
	 int k=name[0]-'A';
	 cin>>m[k].a>>m[k].b;
	} 
	string exper;
	while(cin>>exper)
	{
		int len=exper.length();
		bool error=false;
		int ans=0;
		for(int i=0;i<len;i++)
		{
           if(isalpha(exper[i])) S.push(m[exper[i]-'A']);
		   else if(exper[i]==')')
		   {
		   	node m2=S.top();S.pop();
		   	node m1=S.top();S.pop();
		   	if(m1.b!=m2.a) 
			   {
		   		 error=true;
		   		 break;
			   } 
			   ans+=m1.a*m1.b*m2.b;
			   S.push(node(m1.a,m2.b));
		   }			
		}
		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、付费专栏及课程。

余额充值