自从学习acm也有半年之久了,总体来说虽然有一点点的进步,但是水平依旧很菜。
为何要参见acm,回想起来当初只是觉得有意思想学学看,但后来就知道想要学好不是一件容易的事。相信天下间所有的事都不容易,想要达到某种境界就要付出相应的代价。
大学期间是人生中一个阶段,虽然哪个阶段我认为都是非常重要的,所以在当前的时间里要找点事做,不要让这四年荒废掉。
为此,我在大一的学期里加入了学生会,加入了轮滑社团,但自从加入acm的阵营后有些力不从心了。很多时候时间要不是冲突或者每天都是满满的。既然做出了选择,就不要后悔,心中铭记不忘初心,方得始终。在学生会的经历让我感觉到了这个社会的浮躁,为什么要有这么多的形式主义,当然也交到了志同道合的朋友。决定的事就不要轻易反悔,
当初在学生会干好这一年,我觉得我在这一年的作风应该对得起当初说的话,但是该是我净下心来好好干好自己喜欢的事了,虽然可以继续,我觉得在学生会的目的已经达到了,
我选择了退会。
大学第一年很快已经过了,虽然当时打算的好好的,但是总觉得自己做的不够好,可能是我不够努力,还是其他,我突然有点失望,虽然已经不是第一次对自己的失望,但是不管怎样都不能自暴自弃,路虽然崎岖,但是一定要走的,因为你永远不知道明天会发生什么,放弃了就一定没有明天了。虽然身心疲倦,但是我想在试试,我不甘心就这样下去碌碌无为。
不管怎样,在这半年里我初步了解了acm的各个部分,贪心,搜索,dp等等。每种办法都有其独特的思想,就如老师所说,acm是一门脑洞打开的运动。有了思想和代码能力后你才能解决各种各样的问题,题目的最终目的是尽可能用高效的方法来解决问题。
半年来的acm选修课,每次在星期天的早上,我们几个人一起坐车去本部,虽然经常会迟到,但是老师没有说过什么,但是却对我们的要求很高。虽然有时会付出更多的努力,但是我觉得努力应该不会白费。
算法感悟:
1:贪心算法:是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
贪婪算法可解决的问题通常大部分都有如下的特性:
⑴随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。
⑵有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
⑶还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。
⑷选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
⑸最后,目标函数给出解的值。
⑹为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪婪算法一步一步的进行。起初,算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。每一次都扩充集合,并检查该集合是否构成解。如果贪婪算法正确工作,那么找到的第一个解通常是最优的。
贪心的核心是如何选择贪心的标准,通过每歩最优从而达到总体的最优,而且这是为数不多的o(n)算法,但是它却有很大的局限性,对于大部分问题特别是离散问题是无法解决的。正如我们高代老师所说越难的方法越是能普遍解决问题,但并不是简单的东西就毫无用处,因为复杂问题都是建立在简单问题的基础上推广得到。贪心算法的思想对于动态规划问题就是有借鉴的地方,在我看来,动态规划便是特殊的贪心算法,仅仅体现在贪心的标准上的选取。当然贪心算法是acm的入门算法,让我们初次感觉到acm的魅力。
2:搜索算法:
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。
当然搜索还有一些小的分支,如二分法或三分法等。
bfs 广度优先算法是列举每层所有可能的情况,形式可以用队列的形式来实现
核心:将初始态插入列队,进行搜索判断,最后得到解。
解题类型:通常是求最短路径。
ps:减枝的方法除了条件外还有用优先队列的方法。
dfs 深度优先每次都探索到最终态,但是效率可能不是很高,形式是一迭代函数的形式进行,但是需要进行初始化以便进行回溯。
核心:1函数递归调用2初始化
ps;搜索可以实现某些其他无法常规表达的数学表达式,如容斥原理的话可以用dfs的形式进行表示。
搜索的其他条件:1边界
2方向数组
3出口 可以减枝 有些位置可以位压缩
3:动态规划:动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化(en:memoization)存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
动态规划是最有效的算法之一,它的应用广泛,其核心便是动态转移方程,若能过找到,若能得其则题已经解决大半。但是有的题真的很难找,这就需要你好好理解你写题的状态转移方程的由来,这样才不会只会套模板而无思想。其经典模型有背包模型,lcs,最短路径等等。 动态规划的核心是状态转移方程,若能得其则题已经解决大半。但是有的题真的很难找,这就需要你好好理解你写题的状态转移方程的由来,这样才不会只会套模板而无思想。其经典模型有背包模型,lcs,最短路径等等。
若是真的难题的话我觉的应该是几种思想的结合和算法的结合,这就需要我们将各各基础算法搞明白才行。总之,我的acm之旅已步入起步阶段,希望在今后的日子里好好加油不留遗憾吧。