ACM

 

 

ACM课程总结

 

 

 

    业:  计算机科学与技术

    级:  20144       

    名:  孙晓奇          

    号:  20143899        

 

 

 

 

 

 

 

 

 

 


ACM课程总结

   学做网页,写系统,会让我有一种自己有点“小厉害”的感觉。但是ACM不一样,ACM是无论这道题无论你能不能过,你都知道你很弱。

   大一还在信息的时候,总是觉得自己的编程能力很差(现在也不好)。那时候很着急啊,课本上的东西实在是满足不了我。于是我就试着找书看。买了《c++ primer》,然而我也没看多少。

   学算法的时候,我总是有一种感觉。理解算法和写代码实现是完完全全的两件事情。

   我能理解算法,但绝大多数的时候,我不能用算法实现。那时候我问过老师,老师说还是实践太少了。

   大二学了《数据结构》,选了ACM,突然让我找到了解决以往问题的好方法。数据结构里面学过的算法直接就用在ACM题里面了啊。

   四个专题:

1.       贪心算法

2.       搜索

3.       动态规划

4.       图最短路径最小生成树

1.       贪心算法

贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。

贪心算法的基本思路:

从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。

该算法存在问题:

1. 不能保证求得的最后解是最佳的;

2. 不能用来求最大或最小解问题;

3. 只能求满足某些约束条件的可行解的范围。

实现该算法的过程:

从问题的某一初始解出发;

while 能朝给定总目标前进一步 do

  求出可行解的一个解元素;

由所有解元素组合成问题的一个可行解;

贪心算法几大经典问题

活动时间安排的问题

贪心实例之线段覆盖(lines cover

数字组合问题!

 

 

2.    搜索

DFS

深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

BFS

从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1V2……Vn,然后依次访问与V1V2……Vn相邻且未被访问的顶点。如此继续,找到所要找的顶点或者遍历完整个图。
由此可以看出,用BFS进行搜索所搜索的顶点都是按深度进行扩展的,先找到到V0距离为1的所有顶点,然后找到距离V02的顶点……所以BFS所搜索到的都是最短的路径。

3.    动态规划(DP

   将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。

求解的一般步骤:

(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

    (2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

    (3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

    (4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。

    一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。

实际应用中可以按以下几个简化的步骤进行设计:

    1)分析最优解的性质,并刻画其结构特征。

    2)递归的定义最优解。

    3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值

    4)根据计算最优值时得到的信息,构造问题的最优解

4.      最短路径最小生成树

  很多的算法,这里不再说了

一个学期的课程马上就要结束了,我能把学到的东西用来做什么呢?

就像老师说的,作为大二而且准备考研的我来说,已经没有经历再去参加ACM集训,参加ACM的比赛。

但是学习的意义是什么呢?不排除有些人觉得选课是为了好过,为了绩点。如果秉持这样的目的,恐怕这一学期的ACM对你来说是没多大的意义的。

我选ACM只是单纯的想要学点东西,不为绩点,不为奖牌。

以这样的心态来上课,做题,心情是很平静的。

我很开心能够把学到的东西真正的用上。自己很清楚ACM的难度,所以每作出一道题,我都会很开心。

最重要的还是学无止境啊。

没参加过ACM的比赛,但是应该是很有趣的。

说说收获吧!

首先就是毫无疑问的编程能力的提升。感觉根据算法直接写代码的能力强了很多,对稍微复杂问题的分析能力,解决问题能力得到了全面的提升。还有就是编程中出现的BUG越来越少了。熟悉很多有用的函数,对字符串的处理能力,简化代码的能力,调试代码的能力都提升了一个档次。

比起大一甚至是大二上学期都提升了不少,发现了一直困扰自己的问题的解决方法。ACM的课程结束之后,我依然会继续看这方面的书。可能我现在掌握的东西连入门都谈不上。但不管怎么说,我最起码知道该怎么去努力。

其次就是算法的应用和分析能力。好多问题时没有算法,但是你也必须寻求解决问题的办法。比如说我会PRIME之前自己就写过这个算法,但是是在写完知道才发现自己用的就是那个算法。分析问题,设计结构,特别是时间内存使用效率的把握上,有很大的进步。还有能对一些算法以及思想灵活运用,能写出比平常的算法复杂度更低的算法。但是根据现有的较复杂算法实现代码的能力还是不足。

  其实对于算法最直接的感触还是在数据结构中学到的算法,终于不是只知道这么个算                    

 

法而已,应用的多了,推动的对这些算法了解的更加深刻。

     再然后就是知识的扩展。(英语也算,刚开始看见英语题,简直要疯了的节奏,硬着头皮看下去,慢慢的觉得也适应了)。感觉自己的知识面广了很多,ACM涉及都知识可以广至图论数论博弈论组合数学数据结构算法等等。很多东西是无法归纳到上面某一类中的,区分有用知识和无用知识,还有自学的能力,还有根据所学的知识解决和分析实际问题的能力提高了

 

最后呢,就是费老真的是很负责任的老师呀,跟着老师上课,不仅是ACM,不仅是算法。也了解到很多的关于考研就业,对待问题的态度等等的很多方面的内容。

总结来说:

1.能在大一时就参加ACM最好,这样就可以有一整个暑假的集训时间。大二再参加如果要考研的话时间会有冲突;

2.刷题。刷很多的题。量变能引起质变。刷题的作用很多,熟悉题型,更好地应用算法解决问题,在不同的题目中总结知识点和题目类型。

3.总结反思。每一个ACMer都应该有自己总结的模板,知识点,解题步骤,题目分类等等。自己总结的东西用起来更得心应手嘛。

4.别畏惧。别人看一遍题目就能想到解题方法,过一会就能写出代码。自己想半天才能想到思路,又得半天才能写出代码。长此以往时间长了,心理的落差会很大,就会畏惧题目。其实题目本身并不可怕,可怕的是ACMer.坚持住,别老跟人比较。正如“你若是天才,我便做疯子”。天才曾经也是菜鸟。

5.多交流。自己的思想是有限的,一个题的解法很多,不要被自己局限住。要学会采纳大家的方方面面的想法。然后自己总结,吸收。

      学无止境。ACM对我来说是一个新世界。也是一个有遗憾的世界。未来我还是会努力的。有时间就刷刷题。不断地提升自己的能力。

      别害怕困难呦,觉得难,一定是自己在走上坡路!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值