ACM 中常用的算法有哪些?作者: 张俊Michael

  • 网络上流传的答案有很多,估计提问者也曾经去网上搜过。所以根据自己微薄的经验提点看法。
  • 我ACM初期是训练编码能力,以水题为主(就是没有任何算法,自己靠动脑筋能够实现的),这种题目特点是麻烦,但是不难,30-50道题目就可以了。
  • 然后可以接触一下基础的算法,我感觉搜索方向的比较不错,可以解决很多问题,深搜,广搜,然后各种剪枝能力的锻炼。
  • 搜索感觉不错了就可以去看看贪心,图论,和动态规划方向的了。图论有最短路径,最小生成树,网络流,拓扑排序等等很多,动态规划先去书上看经典例子,最长公共子序列等。各种变形的题目。
  • 数学是ACM中极具杀伤力的武器,我一向很羡慕数学好的队友,精力有限自己数学方面的算法只能说入门。这方面经典的数论,组合数学方面的比较多,计算几何是很重要的,经典模型要熟悉,最近点对,二维三维,凸包以及各种应用。
  • 数据结构方面的就比较多了,基础的堆,栈,队列,并查集,二叉查找树,红黑树,trie树,hash表等等。
  • 用C++参赛的话STL要熟悉,有时候很有帮助,里面的queue,list,map,stack等。
  • ACM到后来算法就成了工具,不断的靠自己意淫一个新的解法来解决问题是最开心的事情了。我们学校ACM一直是一届带一届的,老师只提供经济上的援助,上面的内容是我在大三当队长时教给大一的新队员的入门内容,再深的就靠每个人自己发掘了。

我年轻的时候也觉得ACM考察的是算法和coding

年纪大了以后,我明白了,ACM考察的其实是YY



有算法的题都是秒杀题,

难题都是YY一个方法,或是做一个畸形的变化转成一个有固定解的模型

一位高手对我的建议:



一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的

,主要时间是花在思考算法上,不是花在写程序与debug上。

下面给个计划你练练:



第一阶段:

练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,

因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打

出来.

1.最短路(Floyd、Dijstra,BellmanFord)

2.最小生成树(先写个prim,kruscal要用并查集,不好写)

3.大数(高精度)加减乘除

4.二分查找. 

(代码可在五行以内)

5.叉乘、判线段相交、然后写个凸包.

6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简)

7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式.

8. 

调用系统的qsort, 技巧很多,慢慢掌握.

9. 任意进制间的转换



第二阶段:

练习复杂一点,但也较常用的算法。

如:

1. 二分图匹配(匈牙利),最小路径覆盖

2. 

网络流,最小费用流。

3. 线段树.

4. 并查集。

5. 

熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp

6.博弈类算法。博弈树,二进制法等。

7.最大团,最大独立集。

8.判断点在多边形内。

9. 

差分约束系统.

10. 双向广度搜索、A*算法,最小耗散优先.



第三阶段:

前两个阶段是打基础,第三阶段是锻炼在比赛中可以快速建立模型、想新算法

。这就要平时多做做综合的题型了。

1. 

把oibh上的论文看看(大概几百篇的,我只看了一点点,呵呵)。

2. 

平时扫扫zoj上的难题啦,别老做那些不用想的题.(中大acm的版主经常说我挑简单的来

做:-P )

3. 

多参加网上的比赛,感受一下比赛的气氛,评估自己的实力.

4. 一道题不要过了就算,问一下人,有更好的算法也打一下。

5. 做过的题要记好

逻辑类:枚举、贪心、动态规划、深搜广搜

结构类:栈、并查集、堆、树、拓扑图、图论

几何类:凸包

公式类:Fibonacci,排列组合,概率

几何类的小算法很多,比如求点线关系;还有线性方程组、最大最小流;还有一些特定的算法:最短路劲、排序等。



我感觉最其中重要的是 搜索, 搜索可以对大部分问题提供通解,但会有效率问题,于是有双向广搜、A星搜索等等。在现实应用中,我觉得相对其他一些来讲,搜索也是比较有用的。

最新文章

  1. <<< 编程类开发工具
  2. 上载EXCEL到SAP系统的方法之一
  3. json跨域原理及解决方法
  4. iOS中MVC设计模式
  5. 当Azure里的虚拟机网卡被禁用
  6. 如何编写高质量CSS
  7. 用vue实现简单分页
  8. [LeetCode] Coin Path 硬币路径
  9. MySQL数据库性能优化(享学课堂听课笔记)
  10. SqlSugar ORM 的学习
  11. python3下GUI界面设计之控件精确定位
  12. Nginx的rewrite应用
  13. linux 中的./configuration --prefix=安装路径 的用法(指定源码安装方式的安装路基)
  14. flask 表单
  15. Win10系列:VC++ Direct3D模板介绍2
  16. torchvision
  17. Objc将数据写入iOS真机的plist文件里
  18. [SoapUI] How to create a random UUID in each Request's Headers
  19. JSOI2018R2题解
  20. MVC3权限验证,诡异的OnAuthorization

热门文章

  1. linux下gitflow辅助工具安装和使用
  2. UVa 1479 (Treap 名次树) Graph and Queries
  3. UVa 839 (递归方式读取二叉树) Not so Mobile
  4. Jquery源码中的Javascript基础知识(三)
  5. 点分十进制IP校验、转换,掩码校验
  6. 正则化,数据集扩增,Dropout
  7. C# 创建系统服务并定时执行【转载】
  8. Android 程序员必须掌握的三种自动化测试方法
  9. Swift语法
  10. Arduino开发常见错误