描述
矩阵乘法的运算量与矩阵乘法的顺序强相关。
例如:
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<stdio.h>
#include<string.h>
int list[50][2],n=0;
char string[100];
int main()
{
int i=0,j=0,length=0,cal=0,sum=0,multi=1;
char p;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&list[i][0],&list[i][1]);
}
scanf("%s",string);
length=strlen(string);
for(i=0;i<length;i++)
{
if(string[i]==')')
{
int flag=0;
string[i]=' ';
cal=i-1;
while(cal>=0)
{
if(string[cal]=='(')break;
cal--;
}
string[cal++]=' ';
multi=1;
while(cal!=i)
{
if(string[cal]>='A' && string[cal]<='Z')
{
if(flag==0)
{
p=string[cal];
multi=list[string[cal]-'A'][0]*list[string[cal]-'A'][1];
}else
{
list[p-'A'][1]=list[string[cal]-'A'][1];
multi=multi*list[string[cal]-'A'][1];
string[cal]=' ';
}
flag=1;
}
cal++;
}
sum=sum+multi;
}
}
printf("%d\n",sum);
}