ITPub博客

首页 > > > 我的编程生涯(12):动态规划的烦恼

我的编程生涯(12):动态规划的烦恼

作者:u_453e1a12781dea 时间:2016-02-01 17:32:47 0 删除 编辑
我的编程生涯(12)
动态规划的烦恼



按:应Ager的要求,我逐渐地贴出了我曾经走过的路,从一开始的朦胧,到启蒙,到学习和自我学习的过程和那些心中的感情。

这会是一个系列,Ager说会催促我将其完成。那么就从最开始的朦胧开始吧。大家可以就当做小说来看,不过里面我也会将自己的学习过程,以及之后的一些想法加进去。

篇幅比较长一点,不好意思~另外这些文字本身也会 因为大家的反馈做出一些修改。说白了,这就是一个大坑儿,所以谢谢观赏啦~~

然
 而,在这样宁静的时刻,也不是完全没有苦恼的。

对算法知识的学习本身遇到了问题,其实也可以说是完全没遇到问题——看你怎么理解了。你可以说你学习吉他遇到问题了,但是傻子都知道你只需要保持这么练习的趋势,坚持下去就能够跨过任何坎,所以学吉他有句话“只要有十根手指头就能学习吉他”。其实学算法也完全是这样。

自己在看《算法导论》,从动态规划开始就越吃力。做飞燕算法的题目,做到2星以上就会吃力。很多论坛的题目读不会。我真希望能够找到一种学习曲线比较平滑的方式……

于是买了很多很多关于算法的书,期间还见了飞燕群的flyfox,他是武汉二高的IOer,见面的时候他送了我一本《算法竞赛训练手册》。也蛮有帮助的。

其实任何事情,当你遇到了瓶颈,你首先过不去的那个坎儿是你的心情。难道是这个原因,导致我的回忆里那个时期无比的平淡么?可能也有那么一种意思在里面吧。

反正我就烦恼着,一遍又一遍地看着《算法导论》里面关于动态规划的那章。又反复看着刘汝佳的《信息学竞赛与编程艺术》里面的描述,但是还是深陷其中,不可自拔。我以为我已经知道里面的原理了,但是遇到具体的题目我还是不懂,不知道应该怎么做。

现在才知道,其实我那时根本没懂其中的原理。我明白了这么一个道理:当你看一个技术/概念/知识怎么都看不明白的时候,那么不妨停下来,从头到尾用逻辑把整个知识点梳理一下,看看到底对哪个概念没有形成直观的印象,那通常就是问题。

知道有“最优性原理”并不代表你就能看出问题的最优性原理。因为知道这个词,不代表你就能直观地理解这个词。对于正常的NOIPer或者IOer,理解这个词的方法就是做题,不停地做题,反复地去做题。直到做过了所有常见的题型,然后等着一朝顿悟。但是我却不行——我经常会把搜索题当作动规题去做,而当时还没有一个所谓“DP练习题库”这么一种东西。


那么混着练?饶了我吧。


其实真正不清楚的是一个最基础的东西:问题空间。


我已经忘了我是什么时候领悟这个概念的。问题空间,说起来好牛逼,感觉好玄乎。


但实际上就是很简单的一个东西——在你的头脑里面,你是如何找到答案的。


如果在你的头脑里面,你对一个问题,想到了这么一种“可操作的”方案,可以通过一个一个地检查候选答案的方式去解决问题。那么我们说这个问题的问题空间是线性的;如果你需要深入一种情况,处理完毕,然后回来处理其他的情况,我们说这个问题空间是树状的;如果你需要发现面对的情况不止是可能改变你现在手上掌握的信息,还可能会改变你曾经面对过的情况,那么我们说这个问题空间是图状的。


我可以这样举个例子来理解:假设你要捉小偷,到十个房间去找小偷。那么,你可以一间房子一间房子地去找,因此问题空间是线性的;如果房间里面分小房间,而我们没法一眼就判断小偷在不在这个房间里,那么问题空间就是树状的;而如果小偷会穿墙,或者房间之间是互相连通的,那么问题空间就是图状的……


很显然,在第一种情况下捉到小偷最容易,在最后一种情况下捉到小偷最难,甚至永远都捉不到。


我最开始实际上是被“问题空间”这样的名字给迷惑住了——当然它还有好多个称呼,比如“解空间”,“问题抽象”,等等——恩,如果我搞错了概念,可千万别骂我,我是ACMer渣渣。我一直以为问题空间是指的问题本身的某种结构——这个理解当然没错,只是掉了几个字。问题空间是指的“在你眼中”的问题本身的某种结构…………


选择性失明害死人啊……


找到了问题的结构,本质上就是在对问题进行数学建模。在寻找一种解决问题的具体方案。也许这就是为什么我当初没有领悟这个概念的原因吧:因为领悟这个概念的唯一办法,可能就只有经验的积累——我现在把这个概念说的非常明白了,但是你能不能一眼从问题中看到其中蕴含着的结构呢?不能吧?


那么回到头来,所谓的“动态规划”的“最优性原理”(也叫“最优性子结构”)的含义就是,在你理解的问题结构中,问题可以被分解为几个不同的部分,这个问题的解答是最优的,当且仅当被分解的每个部分的解答都是最优的,也就是说不存在这么一种情况,我将问题划分成三个部分然后求解,但是,整个问题的最优解中,子问题三的对应解答不是最优的。这就好像你的问题模型里面有“岔道”,当你解决一个问题的时候,你不一定从正道走,甚至有时候是一定不能从正道去走,这样的问题就是没法动态规划的。必须保证问题在解答上是“静态”的,才能用动态规划去解决。


而所谓的“无后效性”则简单多了,就是你做出的每次选择,都不会改变你之前做过的决定。比如说,有小偷在十个房间里,而这十个房间互不连通,而且小偷不会穿墙术。


那么当你检查完一号房间以后,你确认小偷不在里面,那么在之后所有的步骤中,你都能确认小偷不会再出现在一号房间,直到最后找到小偷。


那么,显然地,最麻烦的事情不是理解这些概念,而是如何在问题中发现这些概念。如何敏锐地找到这些问题内部所固有的结构,这就是最关键的。而这,显然是需要大量的做题,大量的经验的。这是完全跑不掉的。


最近在网上看到吐槽,说人生如何能动态规划。显然人生不满足最优性原理:你就算在每个时刻都做出正确的决定,最终也可能是不幸福的人生。而人生也不满足无后效性:


你有可能会后悔你做出的那个决定,哪怕在当时,这个结论是五笔正确的。而且可能最麻烦的:你未来的一个正确选择,会显示出你过去那个正确选择,是多么的愚蠢。


而显然,当时的我,很缺乏这样的经验。无论在算法上,还是在感情上。

注:本故事版权属ChinaUnix社区用户starwing83所有,转载请注明出处。

    (未完待续)




原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-07-17

  • 博文量
    1982
  • 访问量
    17909