算法设计方法:从递归到动态规划
0. 元信息
- 主题路径:
docs/topics/algo-design/README.md - 主分类:数据结构与算法
- 辅助分类:计算机基础
- 适合对象:掌握至少一门语言(Python 优先)、会写循环和函数、做过基础数据结构练习;想在面试、竞赛、工程面试题里独立设计算法的人
- 建议周期:8~12 周(每周 10~14 小时,含刷题、推导、复盘)
- 前置知识:Python 控制流、列表、字典、递归;高中数学基础(排列组合、等差等比);
lang-python主题 - 最终目标:看到中等难度题(LeetCode Medium / Codeforces Div2 A
C / AtCoder ABC DE),能在 30 分钟内写出状态转移或递归 + 剪枝的正确解,并解释复杂度
1. 学习路线
递归调用栈与终止条件
→ 回溯模板(排列 / 组合 / 子集)
→ 贪心:交换论证与反证
→ DP:状态、转移、初始化、压缩
→ 分治:归并、快排、最近点对
→ 状态机抽象:FSM 与 DP / BFS
→ 综合刷题与综合项目
每一步都是下一步的前置。贪心和 DP 都建立在递归思维上,分治和状态机把递归扩展到结构化场景。不要跳级刷题,先把范式想清楚。
2. 阶段周数分配
| 阶段 | 8 周方案 | 12 周方案 | 备注 | ||---:|---:|---| | 1. 递归与回溯 | 1 周 | 1.5 周 | 终止条件 + 调用栈图 | | 2. 贪心 | 1 周 | 1.5 周 | 区间调度、活动选择 | | 3. 动态规划 | 2 周 | 2.5 周 | 状态转移 + 滚动数组 | | 4. 分治 | 1 周 | 1.5 周 | 主定理 + 归并 / 快排 | | 5. 状态机 | 1 周 | 1.5 周 | FSM → DP / BFS | | 6. 综合刷题 + 项目 | 1 周 | 2 周 | 60~120 题 + 1 综合项目 | | 7. 复盘与模拟赛 | 1 周 | 1.5 周 | AtCoder / Codeforces |
8 周方案节奏紧,建议前 5 周固定 12 小时;12 周方案多出的时间做重做和重写。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 递归与回溯 | 调用栈、终止条件、剪枝、排列组合子集 | 8 道回溯题(含 N 皇后、子集、单词搜索) | 能画递归树、能估算分支因子、能解释为什么剪枝 |
| 2. 贪心 | 排序后扫描、交换论证、单调性 | 5~8 道区间 / 调度 / 排序贪心 | 能写出排序贪心并用一句话证明正确性 |
| 3. 动态规划 | 状态、转移、初始化、滚动数组 | 15+ DP 题(背包、序列、区间、状压) | 能独立设计状态,能解释每一维含义,能手写空间优化 |
| 4. 分治 | 主定理、递推式、归并、快排、最近点对 | 5 道分治题 + 复述归并快排 | 能写递推式推 T(n)、能讲清楚 merge 与 partition |
| 5. 状态机 | FSM、转移图、状态压缩、BFS 拓扑序 | 5 道状态机题(含买卖股票、打家劫舍) | 能把问题画成 FSM、能解释为什么 BFS 拓扑序能算最短转移 |
| 6. 综合刷题 | 题型分布、错题本、复盘节奏 | 60~120 道题分类笔记 | 错题重做通过率 ≥80% |
| 7. 综合项目 | 设计一个可演示的算法工具 | 1 个 Python 项目 + README + 复盘 | 他人可按 README 复现 |
| 8. 模拟赛 | 限时训练、心态、读题 | 4 场 Codeforces / AtCoder 模拟 | Div2 2 道题 / ABC 4~5 道题水平 |
| 9. 复盘与沉淀 | 错题本、模板库、复盘报告 | 1 份 retrospective.md | 能讲清自己的强弱项 |
关键陷阱:贪心没证明就当 DP 解;DP 没画状态转移就硬写;分治忘了合并代价;状态机把”状态”和”动作”混在一起。
4. 第一周任务
Day 1 运行约定:使用 Python 3.10+。统一格式:
python -X dev -W error -m py_compile foo.py做静态检查;运行用python foo.py < input.txt。代码风格ruff默认;测试用pytest。所有题目代码统一放进algo-design/week<N>/。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 装 Python 3.11、pytest、ruff;手写 5 道递归(阶乘、斐波那契、阶乘和、汉诺塔、递归求和);画出每一题的递归调用栈 | week1/day1/recursion.md 含调用栈图 |
| Day 2 | 6 道回溯:全排列、子集、组合总和、电话号码、括号生成、单词搜索 | week1/day2/backtrack.py + 提交记录 |
| Day 3 | 区间调度 + 活动选择:手写 3 个反例找反证,再写正确版本 | week1/day3/greedy_intro.py |
| Day 4 | DP 入门 5 题:爬楼梯、打家劫舍、最小路径和、零钱兑换、最长递增子序列 | week1/day4/dp_intro.py |
| Day 5 | 归并排序 + 计数逆序对;快排 + partition;理解 merge 与 partition 的差别 | week1/day5/divide.py |
| Day 6 | 状态机 4 题:买卖股票 I/II(含 cooldown)、打家劫舍 II、状态机版爬楼梯 | week1/day6/fsm.py |
| Day 7 | 步骤 A:完成 1 道综合题(如「最长回文子序列」)的完整推导 + 实现;步骤 B:补齐 4 类边界(空串 / 单字符 / 全相同 / 全相反) | week1/day7/lps.py + 测试日志 |
Day 7 步骤 A 把”状态 + 转移 + 初始化 + 输出 + 优化”五段写齐;步骤 B 每次只改一个输入维度。
5. 阶段通用验收
- 不看答案独立重写核心代码;
- 用自己的话解释该范式”解决什么问题、为什么有效、在哪类题里失效”;
- 画一张图:递归树 / 状态转移表 / 分治递推式;
- 测试空数据、最小值、最大值、异常输入;
- 准备至少 3 组自定义数据并贴出实际输出;
- 记录时间复杂度和空间复杂度(含每维含义);
- 能修改已有程序(加剪枝 / 改维度 / 换滚动数组),而不是只能照抄。
交付存放:第 3 项的图、第 5 项的输出、第 6 项的复杂度推导,统一存到
week<N>/notes/或week<N>/<problem>/README.md。
6. 最终验收
-
独立实现:归并排序、快速排序(含 partition)、矩阵链乘、TSP 状压、编辑距离、N 皇后;
-
至少完成 80 道题(LeetCode / Codeforces / AtCoder),分布建议:
子主题 题目数量 难度分布 平台建议 递归与回溯 15 道 8 Easy + 5 Medium + 2 Hard LeetCode 贪心 12 道 6 Easy + 5 Medium + 1 Hard LeetCode + Codeforces 动态规划 25 道 5 Easy + 15 Medium + 5 Hard LeetCode + AtCoder DP 分治 10 道 4 Easy + 5 Medium + 1 Hard LeetCode 状态机 10 道 4 Easy + 5 Medium + 1 Hard LeetCode 综合 8 道 全部 Medium+ Codeforces / AtCoder 约束:至少 25 道达到 Medium,至少 8 道达到 Hard / AtCoder 400+;动态规划题必须覆盖背包、序列、区间、状压四种类型。
-
完成 1 个综合 Python 项目(自带 README,能被他人按文档复现);
-
能用 15 分钟讲清 5 种范式的适用场景、状态设计取舍和时间空间权衡。
7. 综合项目
首选:算法可视化桌面工具(必做:CLI 输入 + 输出 + 可选 GUI)。
- 输入:从 stdin 读取算法名(
merge_sort/quick_sort/lcs/coin_change/n_queens)+ 数据集; - 输出:必输出(1)算法过程的文字回放(每一步的状态、当前下标、做了什么操作);(2)时间 / 空间复杂度与实际耗时;
- 算法:必须用至少 3 种范式(递归 + 分治 + DP);
- 进阶可选:ASCII 动画(终端 / curses)、PyGame GUI、可对比两种算法的可视化。
备选:自动评测器。从 LeetCode / AtCoder 拉指定题目的测试用例,本地批量跑、对比时间、生成错题本。
备选:算法题模板生成器。给定题型关键词,输出 Python 模板代码(状态定义 / 转移 / 初始化 / 空间优化)。
任何项目都必须包含:
- 需求说明;
- 数据结构与算法选择理由;
- 核心模块说明;
- 模块化源码;
- 边界测试;
- 运行说明(
Makefile或清晰的python命令); - README;
- 复盘记录。
项目内交付物(设计/测试/复盘)随项目代码放在项目仓库的 notes/:design.md / test.md / retrospective.md。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 1~5 | 经典书 | CLRS《Introduction to Algorithms》 | https://mitpress.mit.edu/9780262033848/ | 三大范式(分治 / 贪心 / DP)逐章精读 |
| 1~5 | 进阶书 | Udi Manber《Introduction to Algorithms》 | https://www.cs.arizona.edu/~merlin/Algorithms.pdf | 递归思维训练,按数学归纳讲 |
| 1~5 | 进阶书 | Knuth《The Art of Computer Programming》Vol.1~4A | https://www-cs-faculty.stanford.edu/~knuth/taocp.html | 拿来当字典,遇到细节再查 |
| 1~6 | 刷题平台 | LeetCode | https://leetcode.com/ | 题型标签 + 公司标签 + Discussion |
| 1~6 | 刷题平台 | Codeforces | https://codeforces.com/ | 模拟赛 + Editorial |
| 3 | DP 训练 | AtCoder Educational DP Contest | https://atcoder.jp/contests/dp | 26 题系统性 DP 训练 |
| 1~6 | Editorial | AtCoder Editorial | https://atcoder.jp/ | ABC/ARC/AGC 公开题解 |
| 4 | 训练营 | Petrozavodsk Camp | https://codeforces.com/groups/c3v4QqHRIy | 高强度团队训练,难题偏多 |
许可证提示:CLRS 与 Manber 自用学习合理引用;不要复制粘贴 CLRS 课后答案到公开仓库。LeetCode 题面版权见 LeetCode Terms of Service——代码自己写,思路可以分享。
默认使用顺序:先用 LeetCode 按 tag 刷 50 题建立手感 → 跑 AtCoder DP Contest 26 题 → 选读 CLRS 对应章节 → 周末打 Codeforces 模拟赛 → 写复盘到
notes/retrospective.md。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。链接指向原始材料或作者公开内容。竞赛平台和题库持续更新,记录时务必写明题目 ID 与比赛日期。
9.1 背景与动机
算法设计方法这门学问成型于 1960 年代末到 1990 年代初。Faigle、Karp、Tarjan 把”整数规划 + 组合”系统化;Bellman 在 1950 年代提出动态规划;Dijkstra、Huffman、Krusal、Prim 把贪心写成可证明的最优解;Knuth 在 TAOCP 里把基础范式和具体算法都做了工程化整理。Cormen、Leiserson、Rivest、Stein 在 1990 年的 CLRS 把这些范式组织成教学体系。
行业位置:算法面试是 FAANG 及国内大厂标配;竞赛选手(Codeforces 红名 / AtCoder 橙名以上)通常对范式切换非常熟练;工程界对算法的需求集中在”用对结构 + 不写明显低效代码”。一句话总结:算法范式决定你能不能把问题抽象出来,编程能力决定你能不能写对实现,两者缺一不可。
9.2 概念地图
核心概念(≥10):
flowchart TB
Recursion[递归调用栈]
Backtrack[回溯与剪枝]
Greedy[贪心 + 交换论证]
DP[动态规划]
DivideConquer[分治]
FSM[有限状态机]
Memo[memoization / 滚动数组]
Order[拓扑序 / BFS]
Recurrence[递推式 + 主定理]
Permutation[排列 / 组合 / 子集]
Knapsack[背包 / 序列 / 区间 / 状压]
Recursion --> Backtrack
Recursion --> DivideConquer
Recursion --> Memo
Memo --> DP
Backtrack --> Permutation
Greedy --> DP
DivideConquer --> Recurrence
FSM --> DP
FSM --> Order
DP --> Knapsack
关系说明:
- 递归是底座:回溯、分治、memoization DP 都需要递归;
- DP 由”递归 + 状态去重”演化而来,贪心是 DP 在”每步只看局部最优且能证明不破坏全局”下的特例;
- 分治与 DP 的区别:分治的子问题互不重叠(merge sort),DP 的子问题可能重叠(LCS);
- 状态机思维把”问题当前所处的状态”显式抽象出来,可写成 DP 或 BFS 拓扑序。
9.3 基础知识讲解
9.3.1 经典论文
| 资料 | 影响 | 建议读法 |
|---|---|---|
| Bellman, On the Theory of Dynamic Programming(1954/1957) | DP 起源,刻画”最优性原理” | 对照今天的状态转移思想读 |
| Dijkstra, A Note on Two Problems in Connexion with Graphs(1959) | 最短路 + 贪心范式开端 | 跟 Cormen 重述对照看 |
| Huffman, A Method for the Construction of Minimum-Redundancy Codes(1952) | 贪心构造最优前缀码 | 看证明 + 自己推一遍 |
| Cook, The Complexity of Theorem-Proving Procedures(1971) | NP 完全性起点 | 与 Karp 1972 的 21 问题一起读 |
| Karp, Reducibility Among Combinatorial Problems(1972) | 21 个 NP 完全问题 | 用作”该不该用暴力”的边界 |
| Knuth, The Art of Computer Programming(Vol.1~4A,1968 起) | 算法工程化百科 | 字典式查 |
9.3.2 经典书籍
重点读这 5 本。每本都跟一个练习集。
| 书 | 影响 | 用法 |
|---|---|---|
| Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms(CLRS, 4th ed., 2022) | 算法课的工业标准 | 三大范式(分治 / 贪心 / DP)逐章精读 |
| Udi Manber, Introduction to Algorithms: A Creative Approach(1989) | 用数学归纳讲递归 | 把每个算法当归纳证明看 |
| Kleinberg & Tardos, Algorithm Design(2005) | 范式 + 网络流 + NP 完全 | 与 CLRS 互补,更偏设计思路 |
| Skiena, The Algorithm Design Manual(2nd ed., 2008) | 工程视角 + 题目反查 | 当”先打哪道题”的指南 |
| Roughgarden, Algorithms Illuminated 系列(2017~2021) | CLRS 的可视化替代 | 入门期快速建立直觉 |
备查:Knuth TAOCP 当字典;Sedgewick 的 Algorithms 当 Java/C++ 实现对照;Halim 的 Competitive Programming 3 当竞赛书。
9.3.3 优秀博客
| 资料 | 特点 | 用法 |
|---|---|---|
| CP-Algorithms (e-maxx) | 几乎所有竞赛算法都有图解 + 代码 | 当作 Cheatsheet;先看英文版 |
| AtCoder Editorial | 每场 ABC/ARC/AGC 赛后官方题解 | 跟比赛一起读,看标准思路 |
| Codeforces Editorial | 每场 Round 后的题解与社区讨论 | 复盘比赛失败时找官方 Editorial |
| labuladong 的算法笔记 | 中文,DP / 回溯 / BFS 框架化讲解 | 当框架字典,但自己先想再对照 |
| USACO Guide | 美国队训练资料,按难度递进 | 适合做长期刷题路线图 |
9.3.4 核心人物
| 人物 | 主要影响 | 建议追踪的材料 |
|---|---|---|
| Richard Bellman | DP 命名 + 最优性原理 | 1954 RAND 报告、Dynamic Programming 1962 书 |
| Donald Knuth | TAOCP、Tex、LRU 分析 | TAOCP Vol.1~4A、Stanford 公开讲座 |
| Tony Hoare | 快速排序、Hoare 逻辑 | 1960 Quicksort 论文、Communicating Sequential Processes |
| John Hopcroft | 算法分析 + 图算法 | 与 Ullman 合著的 The Design and Analysis of Computer Algorithms |
| Robert Tarjan | Union-Find、Splay、强连通分量 | 1983 Turing Award Lecture |
| Jon Kleinberg | 网络结构、HITS 算法 | Algorithm Design(与 Tardos)、NetworkX 案例 |
| Petr Mitrichev | Codeforces Topcoder 冠军 + 写高质量 Editorial | Codeforces 博客、Topcoder 撰稿 |
| Takuya AtCoder (Takahashi) | AtCoder 平台 + ABC/AGC 出题风格 | AtCoder 创始人访谈、AtCoder Magazine |
9.3.5 开发方法
| 方法 | 具体动作 | 何时用 |
|---|---|---|
| Math induction framing | 把”算法正确性”写成数学归纳,再写代码 | 分治、回溯、DP 推导 |
| Recursion-tree cost | 画递归树,数节点与每层代价 → 推 T(n) | 估算复杂度 |
| State-first design | 先写状态定义与转移图,再写代码 | DP、状态机 |
| Greedy counter-example search | 写贪心后立刻构造反例;找到再换范式 | 任何疑似贪心题 |
| Space optimization ladder | 从二维 DP → 一维 → 滚动数组 → 状态压缩 | DP 内存超限时 |
| Editorial-after-attempt | 30 分钟没思路 → 看 Editorial → 立刻关掉重写 | 避免抄解 |
| Re-do with timer | 重做错题用计时器,目标是原时长的 50% | 复盘 |
9.3.6 重点训练材料(按用途分组)
- AtCoder Educational DP Contest(A~Z,共 26 题):DP 入门到进阶路线图。
- AtCoder ABC/ARC/AGC 题库:每周免费比赛;赛后官方 Editorial。
- Codeforces Round(含 Div.1+2 / Div.2 / Div.3 / Educational):每场 5~7 题,难度分级清晰。
- LeetCode Top Interview 150 / Hot 100:面试导向,类型分布好。
- Petrozavodsk Camp 题库(按年份):高级训练营,难度偏高。
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案或图示 |
|---|---|---|---|
| 1 | 阶乘 / 斐波那契 / 汉诺塔 | 递归三件套;理解调用栈 | 终止条件 + 递推 + 回溯 |
| 2 | 全排列 / 子集 / 组合总和 | 回溯模板三连 | 选/不选 + 顺序去重 |
| 3 | N 皇后 | 回溯剪枝极致 | 行级剪枝 + 对角线位运算 |
| 4 | 活动选择 / 区间调度 | 贪心经典,按结束时间排序 | 排序后一次扫描 |
| 5 | Huffman 编码 | 贪心 + 优先队列 | 最小堆反复合并最小两节点 |
| 6 | 0/1 背包 / 完全背包 | DP 入门 + 空间压缩 | 二维 DP → 一维逆序/正序 |
| 7 | 最长公共子序列 (LCS) | 序列 DP 经典 | 二维 DP,状态是前缀长度 |
| 8 | 最长递增子序列 (LIS) | 一维 DP + 贪心二分 | DP O(n²) 或 patience sorting O(n log n) |
| 9 | 编辑距离 (Levenshtein) | 区间 DP + 滚动数组 | dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+cost) |
| 10 | 矩阵链乘 | 区间 DP 入门 | dp[l][r] = min over k |
| 11 | 旅行商 (TSP) bitmask | 状压 DP 入门 | dp[mask][i] = 走过 mask 停在 i |
| 12 | 归并排序 + 计数逆序对 | 分治模板 + 应用 | 合并时累计 if a[i] > a[j]: cnt += mid - i + 1 |
| 13 | 最近点对 | 分治 + 跨带扫描 | 中线两侧 + y 排序后的 7 点扫描 |
| 14 | 买卖股票(含 cooldown / 手续费) | 状态机 DP | 持有/未持有两状态 |
| 15 | 单词拆分 / 子序列匹配 | FSM BFS 拓扑序 | 状态 = 当前下标;边 = 字典匹配 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 递归调用栈 | 脑子装不下多层调用 | 用”递推 + 回溯”两步拆;先写终止条件 |
| 状态维度的选择 | DP 该选哪几个维度 | 先写暴力递归 → 找重复子问题 → 压维度 |
| 贪心 vs DP 边界 | 不知道该不该用贪心 | 写 DP 后用反例验证贪心 |
| 分治与 DP 区别 | 都是递推,但代价不同 | 看子问题是否重叠 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 设计状态转移 | 想不到递推式 | 把”我做完第 i 步后还剩什么”显式化 |
| 找到正确的状态空间 | 状态选多选少都不行 | 画转移图,看每个状态从哪几个状态来 |
| 时间复杂度反推 | 不会算递归树 | 数叶子 × 每层代价;用 Master Theorem 验 |
| 反例构造 | 贪心看不出反例 | 写完贪心立刻构造 3 个小数据看 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| Python 递归深度限制 | 1000 层就 RecursionError | 用 sys.setrecursionlimit(200000);或改写迭代 |
| 滚动数组下标越界 | 压缩维度时算错边界 | 画二维表手动填几格再编码 |
| 状态压缩位运算 | bitmask / 子集枚举易写错 | 用 for mask in range(1<<n) 走一遍调试 |
| 测评 TLE / MLE | 复杂度估算错 | 用 n=100, 1000, 10000 三档估算后再提交 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 / 文档 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| CLRS《Introduction to Algorithms》 | 4th ed., 2022 | MIT Press | 主流教材 | 第三方 PDF 公开;纸质与电子书需购买 |
| Knuth TAOCP | Vol.1~4A 持续更新 | Addison-Wesley | 长期工程 | 部分 fascicle 公开 PDF |
| AtCoder Educational DP Contest | 26 题固定题库 | AtCoder | 永久开放 | 公开题面 + 官方 Editorial |
| LeetCode 题库 | 持续更新 | LeetCode | 订阅制 | 题面按 ToS 使用;代码可分享 |
| Codeforces | 持续更新 | Codeforces | 公开 | 题面公开;Editorial 公开 |
| ICPC / Petrozavodsk Camp | 每年一届 | ICPC Foundation / ITMO | 公开题库 | 题面公开;Editorial 部分公开 |
| CP-Algorithms (e-maxx) | 持续更新 | 社区 | 活跃 | CC BY-SA |
9.6.2 Scope
- CLRS / TAOCP 给出算法范式与正确性证明;不教语言实现细节。
- AtCoder DP Contest 是 26 题固定训练集,覆盖 DP 所有典型子类型。
- LeetCode 按题型标签和公司标签分类;题面用 ToS 管理。
- Codeforces Round 模拟真实比赛节奏;Editorial 由官方出题人或社区维护。
- 算法可视化工具(Algorithm Visualizer、VisuAlgo)是辅助理解手段,不是答案来源。
9.6.3 Structure
- CLRS 章节结构:Part I Foundations(Part 1~5)、Part II Sorting and Order Statistics、Part III Data Structures、Part IV Advanced Design and Analysis、Part V Advanced Data Structures、Part VI Graph Algorithms、Part VII Selected Topics。
- AtCoder DP Contest 26 题:A
C 入门、DF 基础、GM 进阶、NZ 高级与状压。 - Codeforces Round 一场 5~7 题:Div.2 A/B 是 Easy、C/D 是 Medium、E/F 是 Hard。
- 必须掌握的方法:写递归 → 写 memoization → 改 DP → 优化空间;构造反例;画状态转移图;用 Master Theorem 验 T(n)。
9.6.4 Ecosystem
- 实现语言:Python(简洁)、C++(性能与 STL)、Java(工程)。本计划优先 Python,关键 DP 与状压给 C++ 对照。
- 工具:
itertools(排列组合)、functools.lru_cache(memoization)、heapq(Huffman / Dijkstra)、collections.deque(BFS)、bisect(LIS 优化)、sys.setrecursionlimit(深递归)。 - 在线评测:LeetCode Playground、AtCoder 自定义测试、Codeforces 提交 + Hack 机制。
- 训练平台:USACO Guide、Codeforces Gym、CSES Problem Set(按章节分类)。
9.6.5 Depth Tiers
| 层级 | 能力 | 算法设计主题的可观察标准 |
|---|---|---|
| L0 | 知道存在 | 知道递归、回溯、贪心、DP、分治、状态机 6 种范式 |
| L1 | 看得懂示例 | 能读别人代码判断用了哪种范式 |
| L2 | 能正确调用 | 能对常见题型直接套模板 |
| L3 | 能解释与排错 | 能独立设计状态、转移与剪枝,并解释复杂度 |
| L4 | 能设计与扩展 | 能设计新题型抽象,或对库做范式分析 |
本父主题目标是 L3。状态机与高级 DP 可触及局部 L4,但不作为 8~12 周的硬门槛。
9.6.6 Source
- CLRS 官网:第 4 版目录与勘误。
- AtCoder Educational DP Contest:26 题题面 + Editorial。
- Codeforces:Round 题库与 Editorial。
- CP-Algorithms:社区维护的算法百科。
- 引用版本快照日期:2026-07-30。题库会更新,引用时务必写明题号 / Round 号。
10. 常见误区
- 把”看完视频/书”当成会做;不写代码不刷题;
- 跳过递归直接学 DP,写出来的状态转移无根;
- 贪心题不证明正确性,凭感觉出答案,遇到边界就崩;
- DP 状态多了一维或漏了一维,靠调试发现;
- 分治忘了合并代价,把 O(n log n) 写成 O(n);
- 状态机把”状态”和”动作”混在一起,转移图画不清楚;
- 刷题只刷 Easy,从来不碰 Medium / Hard;
- 错题不复盘,下次遇到同类型还是不会;
- 只看 Editorial 不自己重写,比赛时仍不会;
- 评测 TLE 不分析复杂度,反复试不同常数;
- Python 递归深度超 1000 直接放弃,不知道
setrecursionlimit; - 把 ACM / OI 风格的输入输出格式当 LeetCode 题用,写复杂 I/O;
- 把”打比赛”当成唯一训练方式,忽略工程化项目;
- 学完不复盘,下次面试/比赛依然答不上来。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:数据结构与算法 主 + 计算机基础 辅。