【ACM算法竞赛学习路线】

  1. 语言的选择

算法竞赛首选的编程语言是C/C++,其次是Python。
C/C++有非常强大的STL库,用C++的人很多,学习资源多,很容能够以找到C++的题解。而Python的优点则是简单易学,代码少。

  1. 初学者

首先是编程基本功,包括基本的输入输出和编程思维。

1)输入输出:数据处理
对于算法来说,输入是已知从已知数据中提取有效数据,就是对数据的预处理。比如从字符串中提取子串,转化为整型、浮点型数据。算法比赛通常都是默认多案例的题目,需要使用循环来控制输入,只要有输入就继续执行程序,或者输入0表示结束。这个时候就需要控制字符的细节问题,比如输入的时候会用到换行。输出的话问题就比较少了,只需要考虑按照题目要求格式输出数据即可,比如输出结果占m位,不足m位时,前补0。或者输出图形,这就需要对程序输出有一定的深刻理解,包括一些转义字符的输出。
2)编程思维:暴力、时空复杂度、代码调试,模拟
编程思维需要长期的书写代码来塑造,用循环来枚举所有情况,从中判断是否符合题意,再从保留的有效解中选择最优解。这种方法也叫做暴力破解,利用计算机的强大的计算能力,在有效的时间内列举所有可能,从中择优的方式。在程序设计的过程中,还要有时间复杂度和空间复杂度的概念,在书写程序之前一定要考虑到算法的时间复杂度,粗略估计程序需要计算多少次,看是否能在规定的时间内程序完成计算,不能的话可以考虑到用空间来换时间,或者用时间来换空间,都不行的话只能是有一个新的算法没有学到。编程思维的培养还需要对代码调试有一定的理解,要学会读代码、手写代码。通过代码调试来自学代码,把新学习的算法的每一个步骤打印到屏幕上可以更直观的看到算法的运行过程,进而更加深刻的理解新学习的算法。
编程思维是一个长期锻炼的过程,后期同样需要提升。还有一种经典的题目就是模拟过程,需要对题目描述的每一个步骤使用程序进行模拟,这一类型的题目考察参赛者的抽象能力,思维上难度较低,代码实现较难。比如说大整数乘法和螺旋矩阵。大整数乘法就是对乘法运算中的每一位相乘,并进行进位的一个操作的过程模拟,由于int和long long类型对于几百位几千位的数字无法表示,乘法运算无法计算出其结果,只能通过字符串的方式进行读取,读取后根据乘法运算规则,对每一个字符转化为数字,乘法运算后再转化为字符,中间考虑到进位问题即可。

  1. 基础算法

模拟与高精度问题、排序算法、枚举、递归、贪心、二分、深度优先搜索、广度优先搜索。基础的数据结构:栈、队列、二叉树、集合。字符串匹配问题:前缀和、最长公共子串。

  1. 进阶算法

数据结构:并查集、线段树。动态规划问题:01背包、完全背包、多重背包、树形DP、区间DP、状态压缩DP。字符串匹配问题:KMP算法、AC自动机。数学:素数筛法、GCD、LCM。图论:最短路径、最小生成树。二分匹配。网络流。拓扑排序。

  • 书籍资料

《啊哈,算法》
刘汝佳《算法竞赛入门经典》
背包九讲
DP进阶之路
CSDN博客(在线网站)
博客园(在线网站)

  • OJ

郑州轻工业大学OJ:acm.zzuli.edu.cn
杭电OJ:acm.hdu.edu.cn
北大:poj.org
vjudge.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值