枚举:把有限状态空间走完整
从状态表示、去重与剪枝出发,掌握子集枚举这一类最直接也最可靠的基线算法。
- 枚举
- 位掩码
- 状态空间
Algorithm handbook / C++17
以大一课件覆盖的算法为骨架,不只记住模板:先辨认问题结构,再理解不变量、复杂度与边界。 每篇讲义都包含可复制的 C++17 实现、示例推演和常见错误。
内容由我重新组织和编写,并非课程原课件的转载;标为“延伸阅读”的部分用于建立知识联系,不代表课程逐项覆盖。
显示 22 篇讲义
01 / 5 notes
把状态空间写清楚,再用顺序、剪枝或双向扩展控制规模。
从状态表示、去重与剪枝出发,掌握子集枚举这一类最直接也最可靠的基线算法。
用递归状态、路径不变量和成对的选择/撤销操作,系统生成组合并理解回溯剪枝。
从队列分层不变量推导无权图最短路,并给出距离、前驱与路径恢复的完整模板。
将指数状态空间对半拆分,用排序与二分组合两侧结果,解决约 40 个元素的子集问题。
从双方最优决策的递归定义出发,理解 alpha、beta 的边界含义与不改变答案的剪枝条件。
02 / 4 notes
从单调性、局部选择和子问题结构中找到更快的解法。
用统一的 first-true 模型和半开区间不变量,写出不死循环、少一错误更少的二分模板。
以归并排序为完整范例,理解 Divide、Conquer、Combine 三阶段与递归正确性。
用循环不变量理解选择、插入、冒泡、归并、快速、计数、桶与基数排序,并根据数据规模和值域选择算法。
从排序调度、最优合并、区间选择与按位构造出发,学习设计贪心策略并用交换论证证明正确性。
03 / 4 notes
明确状态、转移、初始化与遍历顺序,系统处理重叠子问题。
从走楼梯、最大连续子段和与最少硬币找零出发,建立状态定义、转移、初始化、遍历顺序和空间优化的完整解题框架。
用容量遍历方向控制物品使用次数,掌握 0/1 与完全背包,并在非课程主线的延伸中了解多重背包。
用“以当前位置结尾”和“双前缀”两类课程主线状态解决 LIS 与 LCS,并把 O(n log n) LIS 明确作为非课程主线延伸。
以相邻石子合并为主线,掌握区间状态、枚举分割点、按长度递推、前缀和与方案恢复。
04 / 2 notes
利用前缀信息与哈希表示,避免重复比较字符。
从最长相等真前后缀推导前缀函数,在失配时复用已知信息,并在线性时间内找出模式串的全部出现位置。
从多项式滚动哈希出发,建立前缀哈希与幂数组,在 O(1) 时间内比较两个子串,并正确处理下标、取模和碰撞风险。
05 / 2 notes
维护不会回头的候选集合,把嵌套扫描降到线性时间。
用下标栈维护尚未找到答案的候选元素,以“右侧第一个严格更大元素”为主线理解单调性、不变量与重复值处理。
用双端队列只保留仍在窗口内、且可能成为答案的候选下标,在线性时间内求出所有滑动窗口最大值。
06 / 5 notes
根据查询、修改与静态/动态约束,选择恰当的数据组织方式。
把数组划分为约根号大小的块,以区间加、区间和为主模板,理解整块标记、散块暴力与复杂度平衡。
利用倍增预处理所有 2 的幂长度区间,以两个可重叠区间在 O(1) 时间回答静态 RMQ,并说明幂等运算限制。
从 lowbit 管辖区间理解树状数组,以单点增量、区间求和为主模板,并推导区间修改与单点或区间查询。
把区间递归拆成不相交节点,以区间加和区间和为完整模板,理解节点合并、lazy 标记下传与常见信息扩展。
把若干连续元素放进一个链表节点,以裂块和并块维持块大小,在数组搬移与链表遍历之间取得根号级折中。