第1章 求解Ad Hoc类问题的编程实验 1
1.1 机理分析法的实验范例 1
1.2 统计分析法的实验范例 5
1.3 相关题库 10
第2章 模拟法的编程实验 35
2.1 直叙式模拟的实验范例 36
2.2 筛选法模拟的实验范例 44
2.3 构造法模拟的实验范例 51
2.4 相关题库 55
第3章 数论的编程实验 69
3.1 素数运算的实验范例 69
3.1.1 使用筛法生成素数的实验范例 69
3.1.2 测试大素数的实验范例 76
3.2 求解不定方程和同余方程的实验范例 81
3.2.1 计算最大公约数和不定方程 81
3.2.2 计算同余方程和同余方程组 85
3.3 积性函数的实验范例 91
3.3.1 使用欧拉函数ψ(n)计算与n互质的正整数个数 92
3.3.2 使用莫比乌斯函数μ(n)计算非平方数n的质因子个数 97
3.4 相关题库 102
第4章 组合分析的编程实验 118
4.1 生成排列组合的实验范例 118
4.1.1 按字典序思想生成下一排列组合 118
4.1.2 按字典序思想生成所有的排列组合 121
4.2 排列组合计数的实验范例 122
4.2.1 一般的排列组合计数公式 123
4.2.2 两种特殊的排列组合计数公式 126
4.3 容斥原理与抽屉原理的实验范例 132
4.3.1 利用抽屉原理求解存在性问题 132
4.3.2 利用容斥原理对并集计数 134
4.4 波利亚定理的实验范例 140
4.4.1 波利亚定理的概念基础 141
4.4.2 利用波利亚定理计算集合在置换群作用下产生的等价类个数 148
4.5 相关题库 157
第5章 贪心法的编程实验 165
5.1 体验贪心法内涵的实验范例 165
5.2 利用数据有序化进行贪心选择的实验范例 172
5.3 在综合性的P类问题中使用贪心法的实验范例 181
5.4 相关题库 187
第6章 动态规划(DP)方法的编程实验 197
6.1 线性DP的实验范例 198
6.1.1 初步体验线性DP问题 198
6.1.2 子集和问题 202
6.1.3 最长公共子序列问题 203
6.1.4 最长递增子序列问题 206
6.2 树形DP的实验范例 213
6.3 状态压缩DP的实验范例 218
6.4 单调优化1D/1D DP的实验范例 224
6.4.1 经典模型1:利用决策代价函数w的单调性优化 224
6.4.2 经典模型2:利用决策区间下界的单调性优化 228
6.4.3 经典模型3:利用最优决策点的凸性优化 233
6.5 相关题库 236
第7章 高级数据结构的编程实验 273
7.1 后缀数组的实验范例 273
7.1.1 使用倍增算法计算名次数组和后缀数组 273
7.1.2 计算最长公共前缀 276
7.1.3 后缀数组的应用 278
7.2 线段树的实验范例 288
7.2.1 线段树的基本概念和基本操作 288
7.2.2 线段树单点更新的维护 290
7.2.3 线段树子区间更新的维护 293
7.3 处理特殊图的实验范例 306
7.3.1 计算欧拉图 306
7.3.2 计算哈密尔顿图 314
7.3.3 计算最大独立集 324
7.3.4 计算割点、桥和双连通分支 327
7.4 相关题库 336
第8章 计算几何的编程实验 354
8.1 点线面运算的实验范例 354
8.1.1 计算点积和叉积 354
8.1.2 计算线段交 361
8.1.3 利用欧拉公式计算多面体 371
8.2 利用扫描线算法计算矩形的面积并 375
8.2.1 沿垂直方向计算矩形的面积并 375
8.2.2 沿水平方向计算矩形的面积并 380
8.3 计算半平面交的实验范例 383
8.3.1 计算半平面交的联机算法 384
8.3.2 利用极角计算半平面交的算法 390
8.4 计算凸包和旋转卡壳的实验范例 398
8.4.1 计算凸包 399
8.4.2 旋转卡壳实验 403
8.5 相关题库 408