题见: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在涉及到性能方面的运算时倍受排挤.
分享到:
相关推荐
这些基本运算为构建更复杂的矩阵表达式提供了基础。 接下来,我们要深入讨论的是矩阵乘法,这是比加减法更为复杂也更为关键的概念。不同于普通数的乘法,矩阵乘法并不总是定义的。两个矩阵A和B可以相乘,当A的列数...
相反,如果A是一个2×3矩阵,B是一个3×3矩阵,像例2.4那样,可以计算AB,但不能计算BA,因为矩阵乘法不满足交换律,即AB≠BA。 2.2.2部分讨论了向量-矩阵乘法,这是矩阵乘法的一种特殊情况。当一个1×n行向量与一...
矩阵乘法的时间复杂度通常为O(n^3),对于两个n×n的矩阵A和B,其乘积C=AB的计算量会随着矩阵规模的增大而迅速增加。 其次,实验报告提到了并行化,这是指将计算任务分散到多个处理器上执行,以减少总计算时间的过程...
2. 矩阵运算:使用矩阵逆矩阵和矩阵乘法来计算矩阵的结果,学习矩阵逆矩阵的概念和矩阵乘法的使用方法。 知识点:矩阵逆矩阵、矩阵乘法、矩阵运算 线性代数 1. 线性代数:使用inv函数和eye函数来计算矩阵的逆矩阵...
- 计算矩阵乘积`AB`,用于求解变换后的坐标或表达式。 - 通过矩阵乘法可以解决图形在一系列连续变换下的新位置。 6. **矩阵与函数关系的变换**: - 曲线在矩阵变换下会得到新的函数解析式,可以通过矩阵乘法找到...
C#,数值计算,矩阵相乘的源代码与数据可视化。在线性代数中,矩阵在处理不同的概念中扮演着重要的角色。...矩阵乘法定义矩阵乘法,也称为矩阵乘积和两个矩阵的乘法,产生一个矩阵。这是一种二进制运算。
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,这意味着不论括号如何...
"16matlab符号矩阵的四则运算"这个主题将深入探讨如何在MATLAB中对符号矩阵执行加法、减法、乘法和除法操作。下面我们将详细介绍这些运算以及相关的知识点。 首先,要进行符号计算,我们需要使用MATLAB的符号工具箱...
当处理多个矩阵的乘法时,选择正确的计算顺序可以显著减少所需的计算次数,尤其是对于大型矩阵来说,这可以极大地提高计算效率。动态规划是一种解决这类问题的有效方法。 动态规划的核心思想是将复杂问题分解为更小...
7. 矩阵乘法:在Mathematica中,两个矩阵相乘可以直接使用乘号运算符(*),例如A.B计算矩阵A和B的乘积。 8. 特殊矩阵:文档中提到的IdentityMatrix[n]用于生成n阶单位矩阵;DiagonalMatrix用于生成对角矩阵;Clear...
符号计算提供了一种精确且灵活的方式来执行加法、减法、乘法和除法,尤其在涉及复杂数学问题时,它可以避免浮点误差,确保结果的精确性。 一、符号变量与符号矩阵的创建 在MATLAB中,我们首先需要定义符号变量来...
- 示例中给出了多个矩阵乘法的计算,如(1)中的两个3x3矩阵相乘得到一个新的3x3矩阵,以及(2)和(4)中的列向量与矩阵的乘积。 - 对于矩阵乘法的计算,我们通常按照元素对应位置的乘积求和来确定结果矩阵的每个元素。...
- 矩阵乘法:两个矩阵A和B,若A的列数与B的行数相同,则可以进行矩阵乘法,结果矩阵C的每个元素c_ij是A的第i行与B的第j列对应元素乘积之和。 - 转置:将矩阵中的行换成列,列换成行,得到一个新的矩阵。 2. 矩阵...
在数学的线性代数领域,矩阵乘法是矩阵理论中的基本运算之一。矩阵乘法具有几个重要的运算法则,这些法则在处理矩阵运算时起着至关重要的作用。以下是矩阵乘法的三个基本法则及其证明: 1. **乘法结合律**:如果A是...
此外,“加括号形式”则要求我们不仅计算结果,还要给出最优的乘法顺序,即用括号表示的乘法表达式。 在实际编程实现中,例如`main.cpp`文件可能包含了计算矩阵连乘的C++代码。这通常包括定义矩阵结构,实现矩阵...
2. 矩阵乘法:非同阶矩阵不能相乘,两个同阶矩阵相乘,每个元素是对应位置元素的乘积之和。矩阵乘法不满足交换律。 3. 数与矩阵相乘:数乘矩阵,每个元素都乘以该数。 4. 矩阵的转置:将矩阵的行变为列,列变为行,...
乘法方法则更为复杂,需要两层循环,第一层遍历第一个矩阵的行,第二层遍历第二个矩阵的列,计算每个元素的乘积并累加。 5. **结果显示**:运算完成后,将结果矩阵显示在界面上,可以使用文本框或列表控件来展示。...
"matrixexp"可能就是这样一个库,提供矩阵表达式的构建、求解和优化,方便用户进行复杂的数学计算。 例如,使用matrixexp库,开发者可能可以轻松地执行以下操作: - 初始化矩阵:创建二维数组表示矩阵。 - 矩阵运算...
例如,计算A和B的乘积: ```matlab E = A * B; ``` E会是一个2x2的新符号矩阵,由A和B按矩阵乘法规则计算得到。 5. 符号矩阵的除法: 对于符号矩阵,除法操作稍微复杂些。如果要进行元素级除法,可以使用`./`...