dp小结
-
思想与个人理解
动态规划是信息学的第二道门槛(第一道是递归),这一类问题独立存在,并且十分重要。我们可以从名字中看出一些端倪。动态规划。这意味着dp是一个动态的过程。我们把一个问题的变化的每个过程单独取出来,成为它的一个状态,它在不断的发生转移。我们在思考动态规划问题的时候应该问自己,这个状态可以从什么状态得来?那他可以变成什么新状态?这其中它在转移过程发生的变化是什么?
我们把这三个要素清晰的表达出来,就等于解决了动态规划的问题。
更实际的,我们把这三个要素变成一个东西:状态转移方程。既然我们要研究状态之间的转移,我们需要把一种物体变化的过程抽象出来的能力,也就是把它的变化抽象成一种种状态之间的转移,这就是设计状态。
-
做题的一些经验总结
一个题目,首先你要看出来它是个动态规划,这往往是有难点的,这就叫我们打破惯性思维,不断尝试新的可能,更可行的方法就是——
去上厕所。
在你发现了它可能是一个动态规划时,你可以从以下角度思考: -
满足题意的要求的可行情况有什么特点?是否有什么特殊要求?需不需要预处理?切忌一拿到题就开始莽,莽完发现思路都错了
-
这个题的状态可以是什么?大部分情况是求什么设什么。你这个时候需要考虑,需要几个维度把完整的状态变化抽象出来,而且维度要尽可能少。
-
设计完状态后,你就要思考,它的一个子状态是怎么转移过来的?举个例子,你要去学校,你可以直接去,你也可以去中山公园里转一圈再去。大概摸清楚状态之间转移的规律后,就可以尝试列状态转移方程了,记住,做题目都有一个过程,没有一个人一开始就是一定正确的,你要在这其中不断摸索,最后才能到达彼岸,所以你一定要耐心,
实在不行就去上厕所。 -
设计完状态之后你就要思考循环。循环,哪一层在里,哪一层在外?循环开始和结束点是什么?if语句要写啥?然后就是一定不要,一定不要犯把i写成j,把j写成i之类的错误。还要注意大括号的位置,静态差错永远大于动态查错,养成分步调试的好习惯,写完一个部分调一个部分,写完了看看变量名,看看大括号位置。
-
如果你以上步骤完成了之后,你程序还不对,你就要开始动态查错了。开始手造一些数据,观察、分析你的程序什么时候可以过,什么时候不能过。最重要的一点是,你不要##到自己脑子把你自己出的数据想错,我就干过这种事,真的蠢死了
-
如果你经历了以上步骤,还是不过,那么你就需要换一下思路,做一下其他题或者把题目放着,说不定你以后走路的时候就想通了,我就经常这样。
虽然被人说:“你走路竟然都在想题”。
其实动态规划最重要的就是练习,只有量的积累才能带来质的飞跃。