`
rappy
  • 浏览: 44659 次
  • 性别: Icon_minigender_1
  • 来自: 天涯海角
文章分类
社区版块
存档分类
最新评论

矩阵乘法:计算任给矩阵表达式(乘法)执行的元乘积次数

阅读更多
题见:http://acm.zju.edu.cn/show_problem.php?pid=1094
Sample Input
9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))

Sample Output
0
0
0
error
10000
error
3500
15000
40500
47500
15125
附代码如下:
public long calculateElementMul(Map<String, int[]> map, String exp)
			throws DataFormatException {
		Stack<String> expStack;
		long times = 0;
		// 0代表括号,1代表一个矩阵,2代表两个矩阵相乘
		int k = 0;
		// 0代表括号中没有矩阵,1代表括号中只有一个矩阵,类推
		int t = 0;
		int left[] = new int[2];
		int right[] = new int[2];
		int index = 0;
		while (exp.length() > 1) {
			expStack = new Stack<String>();
			for (int i = 0; i < exp.length(); i++) {
				String str = exp.substring(i, i + 1);
				expStack.push(str);
				if (str.matches("[A-Z]|([0-9])*")) {
					k++;
					t++;
				} else if (str.matches("\\(|\\)")) {
					if (str.equals(")") && t == 1) {
						expStack.pop();
						String temp = expStack.pop();
						expStack.pop();
						try {
							String pre = expStack.pop();
							if (pre.matches("[A-Z]|([0-9])*")) {
								t++;
								k++;
							}
							expStack.push(pre);
						} catch (EmptyStackException ese) {
						}
						expStack.push(temp);
					} else {
						t = 0;
						k = 0;
					}
				}

				if (k == 2) {
					right = (int[]) map.get(expStack.pop());
					left = (int[]) map.get(expStack.pop());
					if (left[1] != right[0])
						throw new DataFormatException("error");
					map.put(Integer.toString(index), new int[] { left[0],
							right[1] });
					times += left[0] * left[1] * right[1];
					expStack.push(Integer.toString(index));
					index++;
					k--;
					t--;
				}
			}
			StringBuffer sb = new StringBuffer();
			for (String string : expStack) {
				sb.append(string);
			}
			exp = sb.toString();
		}

		return times;
	}

代码只提供核心实现部分.
输入输出控制未提供.
可惜那边没有提供java的解答方式.
看来java在涉及到性能方面的运算时倍受排挤.
分享到:
评论

相关推荐

    矩阵链乘积次数问题(栈和队列的应用) 问题描述:输入n个矩阵的维度和一个矩阵链乘积表达式,请输出按照该表达式计算所有乘积运算的乘法次数之和 如果乘法无法进行,输出error 假定A是m*n矩阵,B是n

    问题描述:输入n个矩阵的维度和一个矩阵链乘积表达式,请输出按照该表达式计算所有乘积运算的乘法次数之和。如果乘法无法进行,输出error。假定A是m*n矩阵,B是n*p矩阵,那么AB是m*p矩阵,A*B运算的乘法次数为m*n*p...

    KIS7.0_key.rar_矩阵乘法

    这些基本运算为构建更复杂的矩阵表达式提供了基础。 接下来,我们要深入讨论的是矩阵乘法,这是比加减法更为复杂也更为关键的概念。不同于普通数的乘法,矩阵乘法并不总是定义的。两个矩阵A和B可以相乘,当A的列数...

    2.2矩阵乘法1

    相反,如果A是一个2×3矩阵,B是一个3×3矩阵,像例2.4那样,可以计算AB,但不能计算BA,因为矩阵乘法不满足交换律,即AB≠BA。 2.2.2部分讨论了向量-矩阵乘法,这是矩阵乘法的一种特殊情况。当一个1×n行向量与一...

    矩阵乘法的并行化实验报告.pdf

    矩阵乘法的时间复杂度通常为O(n^3),对于两个n×n的矩阵A和B,其乘积C=AB的计算量会随着矩阵规模的增大而迅速增加。 其次,实验报告提到了并行化,这是指将计算任务分散到多个处理器上执行,以减少总计算时间的过程...

    矩阵的各种计算:乘法、逆矩阵、转置、行列式等-基于Excel实现

    对于需要进行矩阵运算的用户来说,Excel提供了一种方便的工具来执行矩阵乘法、求逆、转置和计算行列式等操作。 首先,矩阵乘法是一种二元运算,其中两个矩阵相乘会得到一个新的矩阵。在Excel中,矩阵乘法可以通过...

    精讲多练matlab习题.docx

    2. 矩阵运算:使用矩阵逆矩阵和矩阵乘法来计算矩阵的结果,学习矩阵逆矩阵的概念和矩阵乘法的使用方法。 知识点:矩阵逆矩阵、矩阵乘法、矩阵运算 线性代数 1. 线性代数:使用inv函数和eye函数来计算矩阵的逆矩阵...

    高中数学 第八课时:矩阵的乘法的概念课件 苏教版选修4-2数学知识.ppt

    - 计算矩阵乘积`AB`,用于求解变换后的坐标或表达式。 - 通过矩阵乘法可以解决图形在一系列连续变换下的新位置。 6. **矩阵与函数关系的变换**: - 曲线在矩阵变换下会得到新的函数解析式,可以通过矩阵乘法找到...

    矩阵乘积的运算法则的证明.pdf

    在本文中,我们将详细探讨矩阵乘积运算法则,并给出其证明。 首先,我们来证明矩阵乘法的乘法结合律。假设我们有三个矩阵A、B和C,它们的尺寸分别为m×n、n×p和p×q,也就是说,矩阵A的列数与矩阵B的行数相等,...

    符号计算篇:7matlab 符号表达式的加减乘除.zip

    5. **乘法**:乘法操作有多种方式,可以直接使用"*",或者使用`.*`(点乘)在向量或矩阵之间进行逐元素乘法。例如,`expr5 = x*y; expr6 = x.*y;`分别表示x和y的乘积以及它们的逐元素乘积。 6. **除法**:除法用"/...

    算法设计与分析矩阵链相乘

    如果两个矩阵A是p*q矩阵,B是q*r矩阵,它们的乘积C=AB是一个p*r矩阵,计算C的所有元素需要执行p*q*r次乘法操作。对于多个矩阵的连乘,矩阵乘法满足结合律,即(AB)(CD) = (A(BC))D = ((AB)C)D,这意味着不论括号如何...

    matlab符号计算:16matlab符号矩阵的四则运算.zip

    "16matlab符号矩阵的四则运算"这个主题将深入探讨如何在MATLAB中对符号矩阵执行加法、减法、乘法和除法操作。下面我们将详细介绍这些运算以及相关的知识点。 首先,要进行符号计算,我们需要使用MATLAB的符号工具箱...

    矩阵连乘积的动态规划算法设计.pdf

    当处理多个矩阵的乘法时,选择正确的计算顺序可以显著减少所需的计算次数,尤其是对于大型矩阵来说,这可以极大地提高计算效率。动态规划是一种解决这类问题的有效方法。 动态规划的核心思想是将复杂问题分解为更小...

    大学数学实验.pdf

    7. 矩阵乘法:在Mathematica中,两个矩阵相乘可以直接使用乘号运算符(*),例如A.B计算矩阵A和B的乘积。 8. 特殊矩阵:文档中提到的IdentityMatrix[n]用于生成n阶单位矩阵;DiagonalMatrix用于生成对角矩阵;Clear...

    符号计算篇:16matlab符号矩阵的四则运算.zip

    符号计算提供了一种精确且灵活的方式来执行加法、减法、乘法和除法,尤其在涉及复杂数学问题时,它可以避免浮点误差,确保结果的精确性。 一、符号变量与符号矩阵的创建 在MATLAB中,我们首先需要定义符号变量来...

    第一章 矩阵1

    - 示例中给出了多个矩阵乘法的计算,如(1)中的两个3x3矩阵相乘得到一个新的3x3矩阵,以及(2)和(4)中的列向量与矩阵的乘积。 - 对于矩阵乘法的计算,我们通常按照元素对应位置的乘积求和来确定结果矩阵的每个元素。...

    选修4-2+矩阵与变换.pdf

    - 矩阵乘法:两个矩阵A和B,若A的列数与B的行数相同,则可以进行矩阵乘法,结果矩阵C的每个元素c_ij是A的第i行与B的第j列对应元素乘积之和。 - 转置:将矩阵中的行换成列,列换成行,得到一个新的矩阵。 2. 矩阵...

    矩阵连乘问题

    此外,“加括号形式”则要求我们不仅计算结果,还要给出最优的乘法顺序,即用括号表示的乘法表达式。 在实际编程实现中,例如`main.cpp`文件可能包含了计算矩阵连乘的C++代码。这通常包括定义矩阵结构,实现矩阵...

    matlab上机练习题答案.doc

    9. 多项式乘法:conv函数可以用来计算两个多项式的乘积。 10. 符号微分:在MATLAB中,可以使用符号微分函数diff进行微分运算。 11. 对数、指数、三角函数运算:MATLAB中的符号工具箱提供了对数(log)、指数(exp...

    北航研究生矩阵课程习题及答案

    2. 矩阵乘法:非同阶矩阵不能相乘,两个同阶矩阵相乘,每个元素是对应位置元素的乘积之和。矩阵乘法不满足交换律。 3. 数与矩阵相乘:数乘矩阵,每个元素都乘以该数。 4. 矩阵的转置:将矩阵的行变为列,列变为行,...

Global site tag (gtag.js) - Google Analytics