GESP 八级 · GESP 202312 C++ 八级 第 11 题

选择题 · 答案 D · 考点:复杂度分析、递推

← 整套速查表 GESP 八级 全部真题

题目

下面程序的时间复杂度为( )。

int record_choose[MAXN][MAXM];
int choose(int n, int m) {
    if (m == 0 || m == n)
        return 1;
    if (record_choose[n][m] == 0)
        record_choose[n][m] = choose(n - 1, m - 1) + choose(n - 1, m);
    return record_choose[n][m];
}
答案:D

考点

复杂度分析递推

解题思维

这题别被递归树吓住,核心在于数清楚记忆化数组里到底存了多少个有效状态。拿到题先想:递归只会访问哪些 (n,m) 组合?这些组合的总数是多少?每个组合只算一次,时间复杂度就是状态数。

常见错误

最容易错选 A,因为看到递归就下意识想二叉树展开是 2^n,完全忽略了记忆化让每个状态只算一次。其次是 C,把 C(n,m) 这个组合数的「数值大小」当成了「计算次数」,混淆了概念。还有人会卡在对 m 的依赖上,觉得 m 小一点就快很多,但题目问的是最坏情况,得看 m 和 n-m 都接近 n/2 时状态总数最大,这时候才是 O(m*(n-m)) 的峰值。

详细解析(节选)

考点:递归与记忆化|时间复杂度分析|组合数递推

1. 考纲定位

八级算法模块「递归与搜索」中的经典动态规划入门题。命题人在这里卡住的是绝大多数考生的递归树节点数直觉——他们看到回溯结构就下意识想 O(2^n),却完全忽略了「记忆化」这个最关键的条件。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断