描述
在计算 A×B×C 时,不同的运算顺序会带来不同的运算量。例如,(A×B)×C 的运算量是 a×b×c+a×c×d,而 A×(B×C) 的运算量是 b×c×d+a×b×d。
现在,对于给定的 n 个矩阵的大小与运算式,请你计算出所需要的运算量。
输入描述:
第一行输入一个整数 n(1≦n≦15) 代表矩阵的个数。
此后 n 行,第 i 行输入两个整数 ai 和 bi(1≦ai,bi≦100) 代表第 i 个矩阵的行数和列数。
最后一行输入一个长度为 1≦len(s)≦103 的字符串 s 代表运算式。运算式中只包含前 n 个大写字母与括号,第 i 个大写字母对应输入的第 i 个矩阵,括号成对出现,保证运算式合法且正确。
输出描述:
在一行上输出一个整数,代表计算需要的运算量。
- 解析输入:首先读取矩阵的数量和每个矩阵的行数和列数。然后读取运算式。
- 使用栈:我们使用栈来模拟矩阵乘法的运算顺序。当遇到矩阵时,将其行数和列数压入栈中;当遇到右括号时,弹出栈顶的两个矩阵,计算它们的乘法运算量,并将结果矩阵的行数和列数压回栈中。
- 计算运算量:每次弹出两个矩阵时,计算它们的乘法运算量,并累加到总运算量中。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
void (async function () {
function calculateOperations(n, matrices, expression) {
let stack = [];
let totalOperations = 0;
for (let i = 0; i < expression.length; i++) {
let char = expression[i];
if (char === "(") {
// 遇到左括号,不做任何操作
} else if (char === ")") {
// 遇到右括号,弹出栈顶的两个矩阵进行计算
let matrix2 = stack.pop();
let matrix1 = stack.pop();
// 计算运算量
totalOperations += matrix1[0] * matrix1[1] * matrix2[1];
// 将结果矩阵压回栈中
stack.push([matrix1[0], matrix2[1]]);
} else {
// 遇到矩阵,将其行数和列数压入栈中
let index = char.charCodeAt(0) - "A".charCodeAt(0);
stack.push(matrices[index]);
}
}
return totalOperations;
}
// 读取输入
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let n;
let matrices = [];
let expression;
rl.question("", (input) => {
n = parseInt(input);
let count = 0;
rl.on("line", (line) => {
if (count < n) {
let [a, b] = line.split(" ").map(Number);
matrices.push([a, b]);
count++;
} else {
expression = line;
rl.close();
}
});
});
rl.on("close", () => {
// 计算并输出结果
let result = calculateOperations(n, matrices, expression);
console.log(result);
});
})();