大学才开始的ACM应该如何正确学习

ACM(大学生程序设计大赛)现如今已经风靡大学校园。其感染度不仅局限于信息类专业,更是染指了理学类专业。这一项靠数学才能吃香的竞赛让许多大学生沉迷其中,感受到了算法和数学的魅力。

不过,言归正传,如果才刚刚有幸进入学校的ACM集训队,那么如何正确学习ACM知识呢?

ACM内容繁多,涉及到的算法十分宽阔。并且运用到的数学理论和知识也颇为深奥。个人建议,先从数学开始学起。

第一步,需要了解初等数论、组合数学、母函数、概率、常见的递推规律、简单博弈论

这些是你能够理解将要学习的算法的基石,如果要把算法看做一个金字塔的话,数学基础应该在最底层。这些数学知识很多,需要一一了解,有精力的话还可以选择一两项深入研究。

第二步,需要理解算法的几大思想。大致包括动态规划思想、递归思想、贪心思想、分治思想、回溯思想

这些可以算做金字塔的第二层,其重要性丝毫不低于数学。但是这类思想主要靠个人理解,因为没有很多题目可供练习比较,所以个人理解的深浅也是差距各异,无法甄别。虽然说没有很明显的题目,但是很多题目都是包括这些思想的,包括将要学习的各类算法,其主要思想还是离不开这些。

第三步,需要学习数据结构。当然,目前的学习只是基础的,所以只需要学习栈、队列、优先队列、map、哈希、二叉树、并查集、线段树、树状数组。难度是依次递增的,越学到后面,越会感觉脚步变得很慢。但是不要急,这始终是一个累积的过程。梅花香自苦寒来,不经历一些荆棘,怎么能跟其他人分出高低呢?

竞赛精神就是如此,只有努力,才能卓越胜出。一切的投机取巧,一切的揠苗助长,都不可取。

如果能坚持走到这里,那么请你继续坚持下去。因为此时此刻,相信你已经不是一个人在战斗了,而是一支队伍三个人一起战斗。

一般来说,从金字塔的第三层开始的学习,就需要按照自己的个人情况进行选择了,个人在此只是给出一些建议,仅供参考。

如果你是主代码手,那么就需要大量接触算法,精通一些基础算法的模板和一些灵活的变通。你需要从高级数据结构、字符串处理、图论、搜索这几个方面深深钻研。可能你会是队里面最辛苦的一位,但是你无疑会变成队里面实力最强的一位。

如果你是擅长思维转换,那么你就需要在一两个方面十分精通。比如说动态规划,比如说线段树的灵活应用,比如说网络流建模,另外,你还需要接触一些很新颖的题目,不断开拓你的思维广度和深度。这样,你才有绝对的优势。

如果你是数学底子深厚的,那么你就需要在ACM数学范围内的知识点的基础上继续深挖。能够灵活运用数学知识解决题目。数学是一个概念很模糊的名词,世界上任何学问,学到深处,都是数学。所以如果负责数学这一块的,学无止境,可能你会是最苦的,但是你一定是坚持时间最长的。

另外,我还需要谈一谈组队问题。这个真的很重要,能够找到志同道合的队友就像找到互相深爱的另一半一样,你们将会经历ACM中的风风雨雨。你必须重视,宁缺毋滥,不然,最后,可能你会多少有些遗憾。

你可能感兴趣的:(成长心得,ACM)