ACM进阶计划
2017-04-21 ACMACM队不是为了一场比赛而存在的,为的是队员的整体提高。
大学期间,ACM队队员必须要学好的课程有:
- C/C++两种语言
- 高等数学
- 线性代数
- 数据结构
- 离散数学
- 数据库原理
- 操作系统原理
- 计算机组成原理
- 人工智能
- 编译原理
- 算法设计与分析
除此之外,我希望你们能掌握一些其它的知识,因为知识都是相互联系,触类旁通的。
以下学习计划每学期中的内容不分先后顺序,虽说是为立志于学习ACM的同学列的知识清单,但内容不限于ACM的知识。英语之类与专业相距较远的课程请自行分配时间,这里不再列举。
大一上
- C语言基础语法必须全部学会
a) 推荐“语言入门”分类20道题以上
b) 提前完成C语言课程设计 - 简单数学题(推荐“数学”分类20道以上)
需要掌握以下基本算法:
a) 欧几里德算法求最大公约数
b) 筛法求素数
c) 康托展开
d) 逆康托展开
e) 同余定理
f) 次方求模 - 计算几何初步
a) 三角形面积
b) 三点顺序 - 学会简单计算程序的时间复杂度与空间复杂度
- 二分查找法
- 简单的排序算法
a) 冒泡排序法
b) 插入排序法 - 贪心算法经典题目
- 高等数学
大一下
- 掌握C++部分语法,如引用类型,函数重载等,基本明白什么是类。
- 学会BFS与DFS
a) 迷宫求解(最少步数)
b) 水池数目(NYOJ27)
c) 图像有用区域(NYOJ92)
d) 树的前序中序后序遍历 - 动态规划(15题以上),要学会使用循环的方法写动态规划,同时也要学会使用记忆化搜索的方法。
a) 最大子串和
b) 最长公共子序列
c) 最长单调递增子序列(O(n)与O(n log n)算法都需要掌握)
d) 01背包
e) RMQ算法 - 学会分析与计算复杂程序的时间复杂度
- 学会使用栈与队列等线性存储结构
- 学会分治策略
- 排序算法
a) 归并排序
b) 快速排序
c) 计数排序 - 数论
a) 扩展欧几里德算法
b) 求逆元
c) 同余方程
d) 中国剩余定理 - 博弈论
a) 博弈问题与SG函数的定义
b) 多个博弈问题SG值的合并 - 图论:
a) 图的邻接矩阵与邻接表两种常见存储方式
b) 欧拉路的判定
c) 单最短路bellman-ford算法dijkstra算法。
d) 最小生成树的kruskal算法与prim算法。 - 学会使用C语言进行网络编程与多线程编程
- 高等数学
- 线性代数
a) 明确线性代数的重要性,首先是课本必须学好
b) 编写一个Matrix类,进行矩阵的各种操作,并求编写程序解线性方程组。
c) 推荐做一两道“矩阵运算”分类下的题目。
大一假期
- 掌握C++语法,并熟练使用STL
- 试着实现STL的一些基本容器和函数,使自己基本能看懂STL源码
- 图论
a) 使用优先队列优化Dijkstra和Prim
b) 单源最短路径之SPFA
c) 差分约束系统
d) 多源多点最短路径之FloydWarshall算法
e) 求欧拉路(圈套圈算法) - 进行复杂模拟题训练
- 拓扑排序
- 动态规划进阶
a) 完全背包、多重背包等各种背包问题(参见背包九讲)
b) POJ上完成一定数目的动态规划题目
c) 状态压缩动态规划
d) 树形动态规划 - 搜索
a) 回溯法熟练应用
b) 复杂的搜索题目练习
c) 双向广度优先搜索
d) 启发式搜索(包括A*算法,如八数码问题) - 计算几何
a) 判断点是否在线段上
b) 判断线段相交
c) 判断矩形是否包含点
d) 判断圆与矩形关系
e) 判断点是否在多边形内
f) 判断点到线段的最近点
g) 计算两个圆的公切线
h) 求矩形的并的面积
i) 求多边形面积
j) 求多边形重心
k) 求凸包
大二
- 数据结构
a) 单调队列
b) 堆
c) 并查集
d) 树状数组
e) 哈希表
f) 线段树
g) 字典树 - 图论
a) 强连通分量
b) 双连通分量(求割点,桥)
c) 强连通分量与双连通分量缩点
d) LCA、LCA与RMQ的转化
e) 二分图匹配- 二分图最大匹配
- 最小点集覆盖
- 最小路径覆盖
- 二分图最优匹配
- 二分图多重匹配
f) 网络流
- 最大流的基本SAP
- 最大流的ISAP或者Dinic等高效算法(任一)
- 最小费用最大流
- 最大流最小割定理
- 动态规划多做题提高(10道难题以上)
- 数论
a) 积性函数的应用
b) 欧拉定理
c) 费马小定理
d) 威乐逊定理 - 组合数学
a) 群论基础
b) Polya定理与计数问题
c) Catalan数 - 计算几何
a) 各种旋转卡壳相关算法
b) 三维计算几何算法 - 理解数据库原理,学会SQL语句
- 学好计算机组成原理
- 学习Transact-SQL语言,学会使用触发器,存储过程,学会数据库事务等。
- 图论二
a) 网络流的各种构图训练(重要)
b) 最小割与最小点权覆盖等的关系(详见《最小割模型在信息学竞赛中的应用》一文)
c) 次小生成树
d) 第k短路
e) 最小比率生成树 - 线性规划
- 动态规划更高级进阶
- KMP算法
- AC自动机理论与实现
- 博弈论之Alpha-beta剪枝
大二假期
- 自学完离散数学
- 自学概率论的部分章节
- 自学操作系统部分章节
大三
- 巩固之前的知识,进行一遍大复习。
- 一些如蚁群算法,遗传算法,模拟退火算法等人工智能方面应用较广的随机性算法。
- 把编译原理上学的东西应用到编程中:如DFA,NFA,还有语法分析的各种方法等。
当你按上面那些一步步走过来时你已经是牛人了,后面要学的东西,就是由牛人自己来发掘的了。
注:转载自NYOJ,有删改。 原文网址http://acm.nyist.edu.cn/JudgeOnline/step.php。