本文系作者原创,转载请注明出处:https://blog.youkuaiyun.com/coder_what/article/details/83626100
在笔者看来,动态的规划是由递归/递推+储存组成。
一个问题,通过不断的递归/递推,遍历各种可能的结果,到达边界后从而找到最终解。
然而,如果仅仅是递归/递推的话,就很有可能出现超时的情况,这是就用到了动态规划的亮点和核心:用空间换时间:
如何用空间换时间?
试想,对于一个需要多次计算的式子来说,如果我们在第一次计算的时候就直接记录下它的值,那么在之后的计算中直接调
用它的结果就行了,不必再次计算从而浪费时间。
但是要注意的是,建立储存空间后,一定要给其全赋值为0//或者其他同等意义的数,不然不能判断这个空间是否存入数据!
其实我们知道,在用递归的时候,通过不断调用函数,也有可能造成栈溢出或者超时。那么,这时候就需要我们通过一个二维数组通过递推或者栈的方式来规避这种错误。
假设递归我们已经知道,就是重复调用一个函数,使问题变成一个又一个简单但结构相同的子问题
那么是么是递推呢?
递推即使通过多重循环(一般是二重),来储存每一个简单问题状态所产生的结果。*需要注意的是,一般情况下,递归的思路比递推的简单,但是相对了言,递推的效果却要好很多。
无论是递归还是递推,他们都需要一个规律来进行“传递”,这就是我们所说的 “状态转移方程”
笔者看来,动态规划是贪心算法的进阶版,动态规划适用于最优子结构问题(即子问题也是最优的)
关于动态规划,更详细的解释请参考这位dalao博主:http://blog.youkuaiyun.com/baidu_28312631/article/details/47418773
动态规划还有一个重要问题就是对空间进行优化。事实上,在大多数AC代码中,都存在通过把数组压缩来获得空间优化的可能性。这样我们就引入了滚动数组(https://blog.youkuaiyun.com/qq_30796379/article/details/79118407)这个概念
滚动数组的作用在于优化空间,当我们解决问题时,常常需要用到连续的解,但是往往前面的解只用到了一次,即前面的解在用完之后可以舍去,这样就达到了空间的重复利用。
我在别的博客中写了几道关于动态规划的问题(Peking University POJ 1163和1548)和详解。
传送门:
1163:https://blog.youkuaiyun.com/coder_what/article/details/83832160
1548:https://blog.youkuaiyun.com/coder_what/article/details/83857812
4万+

被折叠的 条评论
为什么被折叠?



