接触ACM四个月零20天,在HDU做了291题,在PKU做了40题,在浙大也做了20题左右吧,还有专门为了看某个题目而在个别OJ上也做了一些题目,加起来也有10来道的的样子。除了回家两次20天左右和个别时间去陪女朋友没做题看书,其它时间基本上是坚持每天AC的。去其实做了多少题目并不是最重要的,重要的是学到了什么,让我总结一下。
(暂停AC,寒假集训的时候或集训前几天复出,期待寒假集训取得更大的突破,也期待林学院涌现出更多高手来,但是也欢迎网友有好的问题能跟我讨论讨论,让我学习学习)
1、学到的算法小结:
掌握的非常熟悉的算法:
简单的动态规划:包括思考问题的方式和角度,能从简单的问题中提取出动态规划的状态转移方程,关于矩阵内部运算的DP问题比较熟悉,对常见的动态规划问题和经典问题也有一定的了解。
比较简单的贪心:贪心与其说是一种算法,更是一种思想。在构造最优解的每一步过程中,都在构造局部最优解,解这类问题关键是找到最优策略,并分析最优子结构能否构造全局最优解。
生成函数问题:稍微想几秒钟能马上把模板给写出来。
大数高精度问题,没什么技术含量,主要是细心,耐心。主要是在具体问题中要区分出哪些问题是大数问题。还有就是代码的简化。
PRIME算法求最小生成树,闭着眼睛可以写出来,其实也是贪心思想的应用吧。
求素数时用的筛法,能简化代码,并熟练运用。
打表方法。
欧几里德算法。
调用sort排序。
组合数学上的catalan数的思想。
比较熟练的算法:
最短路的DIJKSTRA。
欧几里德算法的推广,用于解不定方程。
二分图最大匹配的匈牙利方法。
最大独立集,最小路径覆盖等二分匹配的变种问题。
关系论图论中的拓扑排序。
二叉树的应用:判定树。
对数log的思想解决数论中的一些问题。
一些排序算法。
深度优先搜索的思想。
回朔搜索的思想。
二分与分治思想。
搜索中的剪枝技巧。
递规方法以及思想。
运用离散数学中的一些数理逻辑、简单图论、简单数论解决一些问题。
组合数学的一些思想方法:fabonacci数列问题、递推方法、排列组合算法的运用。
博弈论简单问题的分析:巴什博弈,尼姆博弈,巴什博弈。
判断线段相交的跨立实验。
有些了解的算法:
STL的使用:自己学过一点,但是用的不多。
最短路的floyed算法。
最小生成树的kruscal算法。
并查集的思想。
线段树求解RMP问题。
凸包。
注:还有好多很杂的问题难以归类。比如数学上的各种公式,它们思想的由来都值得研究。
2、编程水平的提升:
感觉根据算法直接写代码的能力强了很多,对稍微复杂问题的分析能力,解决问题能力得到了全面的提升。还有就是编程中出现的BUG越来越少了。熟悉很多有用的函数,对字符串的处理能力,简化代码的能力,调试代码的能力都提升了一个档次。
3、算法设计能力
好多问题时没有算法,但是你也必须寻求解决问题的办法。比如说我会PRIME之前自己就写过这个算法,但是是在写完知道才发现自己用的就是那个算法。分析问题,设计结构,特别是时间内存使用效率的把握上,有很大的进步。还有能对一些算法以及思想灵活运用,能写出比平常的算法复杂度更低的算法。但是根据现有的较复杂算法实现代码的能力还是不足。
4、知识的拓展:
感觉自己的知识面广了很多,ACM涉及都知识可以广至图论数论博弈论组合数学数据结构算法等等。很多东西是无法归纳到上面某一类中的,区分有用知识和无用知识,还有自学的能力,还有根据所学的知识解决和分析实际问题的能力提高了。
寒假集训展望:
寒假的集训我会把重点花在搜索、图论、运用数学知识解决实际问题上,特别是数论。在其它方面的练习也要更深入一些,力求更熟练,思想运用更灵活。