基本策略:
1. 先想清楚算法,再写代码
2. 先写代码,再着重考虑空间时间上的优化
3. 代码要简洁直观,尽量少重复代码
小音符:可以看一看这些算法发展的有趣故事,以及有趣的应用
知识体系(借鉴下高手的框架):
第2章 初出茅庐——初级篇 | 2.1 最基础的“穷竭搜索” | 2.1.1 递归函数 |
2.1.2 栈 | ||
2.1.3 队列 | ||
2.1.4 深度优先搜索 | ||
2.1.5 宽度优先搜索 | ||
2.1.6 特殊状态的枚举 | ||
2.1.7 剪枝 | ||
2.2 一往直前!贪心法 | 2.2.1 硬币问题 | |
2.2.2 区间问题 | ||
2.2.3 字典序最小问题 | ||
2.2.4 其他例题 | ||
2.3 记录结果再利用的“动态规划” | 2.3.1 记忆化搜索与动态规划 | |
2.3.2 进一步探讨递推关系 | ||
2.3.3 有关计数问题的DP | ||
2.4 加工并存储数据的数据结构 | 2.4.1 树和二叉树 | |
2.4.2 优先队列和堆 | ||
2.4.3 二叉搜索树 | ||
2.4.4 并查集 | ||
2.5 它们其实都是“图” | 2.5.1 图是什么 | |
2.5.2 图的表示 | ||
2.5.3 图的搜索 | ||
2.5.4 最短路问题 | ||
2.5.5 最小生成树 | ||
2.5.6 应用问题 | ||
2.6 数学问题的解题窍门 | 2.6.1 辗转相除法 | |
2.6.2 有关素数的基础算法 | ||
2.6.3 模运算 | ||
2.6.4 快速幂运算 | ||
2.7 一起来挑战GCJ的题目(1) | 2.7.1 Minimum Scalar Product | |
2.7.2 Crazy Rows | ||
2.7.3 Bribe the Prisoners | ||
2.7.4 Millionaire | ||
第3章 出类拔萃——中级篇 | 3.1 不光是查找值!“二分搜索” | 3.1.1 从有序数组中查找某个值 |
3.1.2 假定一个解并判断是否可行 | ||
3.1.3 最大化最小值 | ||
3.1.4 最大化平均值 | ||
3.2 常用技巧精选(一) | 3.2.1 尺取法 | |
3.2.2 反转(开关问题) | ||
3.2.3 弹性碰撞 | ||
3.2.4 折半枚举(双向搜索) | ||
3.2.5 坐标离散化 | ||
3.3 活用各种数据结构 | 3.3.1 线段树 | |
3.3.2 Binary Indexed Tree | ||
3.3.3 分桶法和平方分割 | ||
3.4 熟练掌握动态规划 | 3.4.1 状态压缩DP | |
3.4.2 矩阵的幂 | ||
3.4.3 利用数据结构高效求解 | ||
3.5 借助水流解决问题的网络流 | 3.5.1 最大流 | |
3.5.2 最小割 | ||
3.5.3 二分图匹配 | ||
3.5.4 一般图匹配 | ||
3.5.5 匹配、边覆盖、独立集和顶点覆盖 | ||
3.5.6 最小费用流 | ||
3.5.7 应用问题 | ||
3.6 与平面和空间打交道的计算几何 | 3.6.1 计算几何基础 | |
3.6.2 极限情况 | ||
3.6.3 平面扫描 | ||
3.6.4 凸包 | ||
3.6.5 数值积分 | ||
3.7 一起来挑战GCJ的题目(2) | 3.7.1 Numbers | |
3.7.2 No Cheating | ||
3.7.3 Stock Charts | ||
3.7.4 Watering Plants | ||
3.7.5 Number Sets | ||
3.7.6 Wi-fi Towers | ||
第4章 登峰造极——高级篇 | 4.1 更加复杂的数学问题 | 4.1.1 矩阵 |
4.1.2 模运算的世界 | ||
4.1.3 计数 | ||
4.1.4 具有对称性的计数 | ||
4.2 找出游戏的必胜策略 | 4.2.1 游戏与必胜策略 | |
4.2.2 Nim | ||
4.2.3 Grundy数 | ||
4.3 成为图论大师之路 | 4.3.1 强连通分量分解 | |
4.3.2 2-SAT | ||
4.3.3 LCA | ||
4.4 常用技巧精选(二) | 4.4.1 栈的运用 | |
4.4.2 双端队列的运用 | ||
4.4.3 倍增法 | ||
4.5 开动脑筋智慧搜索 | 4.5.1 剪枝 | |
4.5.2 A*与IDA* | ||
4.6 划分、解决、合并:分治法 | 4.6.1 数列上的分治法 | |
4.6.2 树上的分治法 | ||
4.6.3 平面上的分治法 | ||
4.7 华丽地处理字符串 | 4.7.1 字符串上的动态规划算法 | |
4.7.2 字符串匹配 | ||
4.7.3 后缀数组 | ||
4.8 一起来挑战GCJ的题目(3) | 4.8.1 Mine Layer | |
4.8.2 Year of More Code Jam | ||
4.8.3 Football Team | ||
4.8.4 Endless Knight | ||
4.8.5 The Year of Code Jam |
ACM 竞赛中考察的基本题型
1.Mathematics | Prime Number |
Big Integer | |
Permutation | |
Number Theory | |
Factorial | |
Fibonacci | |
Sequences | |
Modulus | |
2.Dynmic Programming | Longest Common Subsequence |
Longest Increasing Subsequence | |
Edit Distance | |
0/1 Knapsack | |
Coin Change | |
Matrix Chain Multiplication | |
Max Interval Sum | |
3.Graph | Traversal |
Flood Fill | |
Floyed Warshal | |
MST | |
Max Bipertite Matching | |
Network Flow | |
Aritculation Point | |
4.Sorting | Bubble Sort |
Quick Sort | |
Merge Sort (DAndC) | |
Selection Sort | |
Radix Sort | |
Bucket Sort | |
5.Searching | Complete Search, Brute Force |
Binary Search (DAndC) | |
BST | |
6.Simulation | Josephus |
String Processing String Matching | |
Pattern Matching | |
7.Computational Geometry | Convex Hull |
8.AdHoc | Trivial Problems |
参考资料:
1. 挑战程序设计竞赛(第2版)
2. Art of Programming Contest