标题：算法竞赛入门经典（算法艺术与信息学竞赛）
图书信息
作　者：刘汝佳　编著 　　
出 版 社：清华大学出版社 　　
出版时间：2009-11-1 　　
版　次：1
页　数：289
字　数：347000
印刷时间：2009-11-1
开　本：16开纸　
张：胶版纸印　
次：1
I S B N：9787302206088包　
装：平装 
内容简介
该书是一本算法竞赛的入门教材，把C/C++语言、算法和解题有机地结合在了一起，淡化理论，注重学习方法和实践技巧。全书内容分为11章，包括程序设计入门、循环结构程序设计、数组和字符串、函数和递归、基础题目选解、数据结构基础、暴力求解法、高效算法设计、动态规划初步、数学概念与方法、图论模型与算法，覆盖了算法竞赛入门所需的主要知识点，并附有大量习题。书中的代码规范、简洁、易懂，不仅能帮助读者理解算法原理，还能教会读者很多实用的编程技巧。另外，书中包含的各种开发、测试和调试技巧也是在传统的语言、算法类书籍中难以见到的。　 　　
该书可作为全国青少年信息学奥林匹克联赛（NOIP）的复赛教材及ACM国际大学生程序设计竞赛（ACM/ICPC）的入门参考，还可作为IT工程师与科研人员的参考用书。
目录
第1部分 语言篇
第1章 程序设计入门1
1.1 算术表达式1
1.2 变量及其输入3
1.3 顺序结构程序设计6
1.4 分支结构程序设计9
1.5 小结与习题13
1.5.1 数据类型实验13
1.5.2 scanf输入格式实验13
1.5.3 printf语句输出实验13
1.5.4 测测你的实践能力14
1.5.5 小结14
1.5.6 上机练习15
第2章 循环结构程序设计16
2.1 for循环16
2.2 循环结构程序设计19
2.3 文件操作23
2.4 小结与习题27
2.4.1 输出技巧28
2.4.2 浮点数陷阱28
2.4.3 64位整数28
2.4.4 C++中的输入输出29
2.4.5 小结30
2.4.6 上机练习31
第3章 数组和字符串33
3.1 数组33
3.2 字符数组37
3.3 最长回文子串41
3.4 小结与习题45
3.4.1 必要的存储量45
3.4.2 用ASCII编码表示字符45
3.4.3 补码表示法46
3.4.4 重新实现库函数47
3.4.5 字符串处理的常见问题47
3.4.6 关于输入输出47
3.4.7 I/O的效率47
3.4.8 小结49
3.4.9 上机练习50
第4章 函数和递归51
4.1 数学函数51
4.1.1 简单函数的编写51
4.1.2 使用结构体的函数52
4.1.3 应用举例53
4.2 地址和指针56
4.2.1 变量交换56
4.2.2 调用栈57
4.2.3 用指针实现变量交换59
4.2.4 初学者易犯的错误61
4.3 递归62
4.3.1 递归定义62
4.3.2 递归函数63
4.3.3 C语言对递归的支持64
4.3.4 段错误与栈溢出66
4.4 本章小结67
4.4.1 小问题集锦67
4.4.2 小结68
第2部分 算法篇
第5章 基础题目选解69
5.1 字符串69
5.1.1 WERTYU69
5.1.2 TeX括号70
5.1.3 周期串71
5.2 高精度运算71
5.2.1 小学生算术72
5.2.2 阶乘的精确值72
5.2.3 高精度运算类bign73
5.2.4 重载bign的常用运算符75
5.3 排序与检索77
5.3.1 6174问题77
5.3.2 字母重排78
5.4 数学基础81
5.4.1 Cantor的数表81
5.4.2 因子和阶乘82
5.4.3 果园里的树84
5.4.4 多少块土地86
5.5 训练参考86
5.5.1 黑盒测试86
5.5.2 在线评测系统87
5.5.3 推荐题目88
第6章 数据结构基础89
6.1 栈和队列89
6.1.1 卡片游戏89
6.1.2 铁轨91
6.2 链表93
6.2.1 初步分析93
6.2.2 链式结构95
6.2.3 对比测试96
6.2.4 随机数发生器98
6.3 二叉树99
6.3.1 小球下落99
6.3.2 层次遍历101
6.3.3 二叉树重建105
6.4 图106
6.4.1 黑白图像107
6.4.2 走迷宫108
6.4.3 拓扑排序110
6.4.4 欧拉回路111
6.5 训练参考112
第7章 暴力求解法114
7.1 简单枚举114
7.1.1 除法114
7.1.2 最大乘积115
7.1.3 分数拆分115
7.1.4 双基回文数116
7.2 枚举排列116
7.2.1 生成1～n的排列116
7.2.2 生成可重集的排列118
7.2.3 解答树118
7.2.4 下一个排列119
7.3 子集生成120
7.3.1 增量构造法120
7.3.2 位向量法121
7.3.3 二进制法122
7.4 回溯法123
7.4.1 八皇后问题123
7.4.2 素数环126
7.4.3 困难的串127
7.4.4 带宽128
7.5 隐式图搜索129
7.5.1 隐式树的遍历129
7.5.2 一般隐式图的遍历130
7.5.3 八数码问题131
7.5.4 结点查找表133
7.6 训练参考136
第8章 高效算法设计138
8.1 算法分析初步138
8.1.1 渐进时间复杂度138
8.1.2 上界分析140
8.1.3 分治法140
8.1.4 正确对待算法分析结果142
8.2 再谈排序与检索143
8.2.1 归并排序143
8.2.2 快速排序145
8.2.3 二分查找145
8.3 递归与分治148
8.3.1 棋盘覆盖问题148
8.3.2 循环日程表问题149
8.3.3 巨人与鬼149
8.3.4 非线性方程求根150
8.3.5 最大值最小化151
8.4 贪心法151
8.4.1 最优装载问题151
8.4.2 部分背包问题152
8.4.3 乘船问题152
8.4.4 选择不相交区间152
8.4.5 区间选点问题153
8.4.6 区间覆盖问题154
8.4.7 Huffman编码154
8.5 训练参考156
第3部分 竞赛篇
第9章 动态规划初步158
9.1 数字三角形158
9.1.1 问题描述与状态定义158
9.1.2 记忆化搜索与递推159
9.2 DAG上的动态规划161
9.2.1 DAG模型161
9.2.2 最长路及其字典序162
9.2.3 固定终点的最长路和最短路163
9.3 0-1背包问题167
9.3.1 多阶段决策问题167
9.3.2 规划方向168
9.3.3 滚动数组169
9.4 递归结构中的动态规划170
9.4.1 表达式上的动态规划170
9.4.2 凸多边形上的动态规划171
9.4.3 树上的动态规划171
9.5 集合上的动态规划172
9.5.1 状态及其转移173
9.5.2 隐含的阶段173
9.6 训练参考174
第10章 数学概念与方法176
10.1 数论初步176
10.1.1 除法表达式176
10.1.2 无平方因子的数178
10.1.3 直线上的点179
10.1.4 同余与模算术180
10.2 排列与组合182
10.2.1 杨辉三角与二项式定理182
10.2.2 数论中的计数问题184
10.2.3 编码与解码186
10.2.4 离散概率初步187
10.3 递推关系188
10.3.1 汉诺塔188
10.3.2 Fibonacci数列189
10.3.3 Catalan数191
10.3.4 危险的组合192
10.3.5 统计n-k特殊集的数目193
10.4 训练参考194
第11章 图论模型与算法196
11.1 再谈树196
11.1.1 无根树转有根树196
11.1.2 表达式树197
11.1.3 最小生成树199
11.1.4 并查集200
11.2 最短路问题201
11.2.1 Dijkstra算法202
11.2.2 稀疏图的邻接表203
11.2.3 使用优先队列的Dijkstra算法204
11.2.4 Bellman-Ford算法205
11.2.5 Floyd算法206
11.3 网络流初步207
11.3.1 最大流问题207
11.3.2 增广路算法208
11.3.3 最小割最大流定理210
11.3.4 最小费用最大流问题211
11.4 进一步学习的参考212
11.4.1 编程语言213
11.4.2 数据结构213
11.4.3 算法设计213
11.4.4 数学214
11.4.5 参赛指南214
11.5 训练参考215
附录A 开发环境与方法216
A.1 命令行216
A.1.1 文件系统216
A.1.2 进程217
A.1.3 程序的执行217
A.1.4 重定向和管道218
A.1.5 常见命令218
A.2 操作系统脚本编程入门219
A.2.1 Windows下的批处理219
A.2.2 Linux下的Bash脚本220
A.2.3 再谈随机数221
A.3 编译器和调试器221
A.3.1 gcc的安装和测试221
A.3.2 常见编译选项222
A.3.3 gdb简介223
A.3.4 gdb的高级功能224
A.4 浅谈IDE225