矩阵链乘(Matrix Chain Multiplication)

拼搏现实的明天。 2022-12-01 01:21 227阅读 0赞

题目描述

​假设你必须评估一种表达形如 ABCDE,其中 A,B,C,D,E是矩阵。既然矩阵乘法是关联的,那么乘法的顺序是任意的。然而,链乘的元素数量必须由你选择的赋值顺序决定。
​ 例如,A,B,C分别是 50 * 10 ,10 * 20 和 20 * 5 的矩阵。现在有两种方案计算 A * B * C ,即(A * B) * C 和 A*(B * C)。
第一个要进行15000次基本乘法,而第二个只进行3500次。
​你的任务就是写出一个程序判定以给定的方式相乘需要多少次基本乘法计算。

输入格式

输入包含两个部分:矩阵和表达式。
输入文件的第一行包含了一个整数 n(1 ≤ n ≤ 26), 代表矩阵的个数。接下来的n行每一行都包含了一个大写字母,说明矩阵的名称,以及两个整数,说明行与列的个数。
第二个部分严格遵守以下的语法:
SecondPart = Line { Line }
Line = Expression
Expression = Matrix | “(” Expression Expression “)”
Matrix = “A” | “B” | “C” | … | “X” | “Y” | “Z”

输出格式

​ 对于每一个表达式,如果乘法无法进行就输出 “ error “。否则就输出一行包含计算所需的乘法次数。

输入输出样例

输入

  1. 9
  2. A 50 10
  3. B 10 20
  4. C 20 5
  5. D 30 35
  6. E 35 15
  7. F 15 5
  8. G 5 10
  9. H 10 20
  10. I 20 25
  11. A
  12. B
  13. C
  14. (AA)
  15. (AB)
  16. (AC)
  17. (A(BC))
  18. ((AB)C)
  19. (((((DE)F)G)H)I)
  20. (D(E(F(G(HI)))))
  21. ((D(EF))((GH)I))

输出

  1. 0
  2. 0
  3. error
  4. 10000
  5. error
  6. 3500
  7. 15000
  8. 40500
  9. 47500
  10. 15125
  11. #include<cstdio>
  12. #include<stack>
  13. #include<iostream>
  14. #include<string>
  15. using namespace std;
  16. struct matrix
  17. {
  18. int a,b;
  19. matrix(int a=0,int b=0):a(a),b(b){ }
  20. }m[26];
  21. stack<matrix> s;
  22. int main()
  23. {
  24. int n;
  25. cin>>n;
  26. for(int i=0;i<n;i++)
  27. {
  28. string name;
  29. cin>>name;
  30. int k=name[0]-'A';
  31. cin>>m[k].a>>m[k].b;
  32. }
  33. string expr;
  34. while(cin>>expr)
  35. {
  36. int len=expr.length();
  37. bool error=false;
  38. int ans=0;
  39. for(int i=0;i<len;i++)
  40. {
  41. if(isalpha(expr[i]))
  42. {
  43. s.push(m[expr[i]-'A']);
  44. }
  45. else if(expr[i]==')')
  46. {
  47. matrix m2=s.top();
  48. s.pop();
  49. matrix m1=s.top();
  50. s.pop();
  51. if(m1.b!=m2.a)
  52. {
  53. error=true;
  54. break;
  55. }
  56. ans+=m1.a*m1.b*m2.b;
  57. s.push(matrix(m1.a,m2.b));
  58. }
  59. }
  60. if(error)
  61. {
  62. printf("error\n");
  63. }
  64. else
  65. {
  66. printf("%d\n",ans);
  67. }
  68. }
  69. return 0;
  70. }

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读

    相关 矩阵

    题目:       输入n个矩阵的维度和一些矩阵的链乘表达式,输出乘法的次数。如果乘法无法进行,输出error。假定A是m\n矩阵,B是n\p的矩阵,那么A\B是m\p的

    相关 NBUT 1003 最优矩阵

    题意:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。