1. 项目概述
最近在准备C++机试的同学应该都深有体会,算法题的训练需要大量实战积累。今天我想分享的是我在练习牛客网《计算机考研复试机试真题》中t76-t80这五道题目的完整解题思路和代码实现。这些题目涵盖了动态规划、图论、字符串处理等常见考点,非常具有代表性。
作为经历过多次机试的老手,我特别理解大家在面对这类题目时的困惑——看题解时觉得很简单,自己动手却总是卡壳。因此本文将不仅给出标准答案,更会详细拆解每道题的思考过程,包括如何从题目描述中提取关键信息、如何选择合适的数据结构和算法、以及调试过程中遇到的典型错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心题目解析
2.1 T76 矩阵乘法计算量估算
这道题考察的是矩阵乘法链的计算量优化问题,属于经典的动态规划应用场景。
问题描述:
给定n个矩阵的维度(如A是10×30,B是30×5)和它们的乘法顺序(用括号表示),要求计算完成这个乘法需要的标量乘法次数。
关键思路:
- 使用栈数据结构处理括号表达式
- 遇到左括号入栈,遇到右括号出栈计算
- 维护当前矩阵的行列数,累计计算量
cpp复制#include <iostream>
#include <stack>
#include <vector>
using namespace std;
struct Matrix {
int row;
int col;
};
int calculate(const string& s, vector<Matrix>& mats) {
stack<Matrix> st;
int res = 0;
for (char c : s) {
if (c == '(') continue;
if (c == ')') {
Matrix m2 = st.top(); st.pop();
Matrix m1 = st.top(); st.pop();
res += m1.row * m1.col * m2.col;
st.push({m1.row, m2.col});
} else {
st.push(mats[c-'A']);
}
}
return res;
}
int main() {
int n; cin >> n;
vector<Matrix> mats(n);
for (int i = 0; i < n; ++i) {
cin >> mats[i].row >> mats[i].col;
}
string s; cin >> s;
cout << calculate(s, mats) << endl;
return 0;
}
注意事项:
- 矩阵维度存储顺序很重要,A×B要求A的列数等于B的行数
- 遇到连续右括号时需要从栈顶依次取出两个矩阵计算
- 计算结果矩阵的行列数要正确更新
