通俗理解动态规划与递归

动态规划是什么

将原问题分解成多阶段决策的子问题,再采取自底向上的方法求解。

动态规划三个条件:最优子结构,无后效性,重叠子问题

最优子结构:一个问题的最优解包含了子问题最优解。反过来说,即子问题的最优解能够推出原问题的最优解,为动态规划提供了问题分解的依据。

无后效性:未来与过去无关,只与现在有关。即对于某个阶段能够写出一个关于当前状态转移方程,使其转移到下一个阶段。是多阶段决策的桥梁。

重叠子问题:出现重复的子问题。动态规划自底向上的方法就能够避免该问题出现,在自底向上中,子问题只会被计算一次并存储起来(若有需要被存储,滚动数组不必)。

动态规划与递归
同:
其实我们在用递归的时候不难发现,一个能用递归形式解决的问题(若问题的解不止一个且有最优的一个),其必定满足最优子结构。递归天生就将一个原问题分解成子问题,且子问题一定是为原问题做出贡献的,否则也没必要这么分解。
其次,递归的解法也是满足无后效性的。回想在递归的解法中,将问题分解成子问题的时候,并不考虑子子问题是如何,这不就是反着来看无后效性吗?未来是原问题,现在是子问题,过去是子子问题。
递归需要找到递归的边界,问题的出口。动态规划也需要找到basecase,即把最小的问题先填到表上,后续的问题才能慢慢解决。
递归需要递归函数,动态规划需要状态转移方程。递归函数和状态转移方程本质都是将问题转移的方法。
异:
递归是自顶向下的分析。过程是先自顶向下,再自底向上。而动态规划直接采取自底向上的方法,只有一个过程。

其实不难发现,递归和动态规划的本质都是把原问题分成多阶段决策的子问题,只是二者的所采取的实现方法有所不同。且多数问题递归会出现重复子问题,动态规划则避免了重叠子问题。姑且认为,能用递归解决的问题,都可以转化为动态规划来做。

动态规划三要素

  1. 阶段,一般根据空间和时间的特征划分
  2. 状态,事物具有的客观属性
  3. 决策,当前阶段和状态所采取的动作

动态规划步骤
1.找到问题的解形式(明确问题)
2.万事开头难,请做出第一步选择(决策)
3.根据选择来发现状态的变化(找到合适状态)
4.写出状态转移方程(递推方程)
5.分析边界情况
6.自底向上,填表格

2.3步调换的原因是因为开始就找到合适的状态可能并不容易,在清楚问题的解形式后可以尝试做出普适性的决策来辅助找到适合的状态。
如0-1背包中问题的解形式是对于给定的物品a1,a2,a3,…,an一定有ai要么为0,要么为1,不妨任意选择a1=0,则背包容量不变,可供选择的物品减少了。选择a1=1,则背包容量改变,可供选择的物品减少了。经过上面的分析自然的就能发先状态的变化,然后再使得阶段有序,从第一个物品开始选择,就能定义dp数组。
高楼扔鸡蛋也是如此,最坏的情况必定是对于需要扔最多次鸡蛋的楼层有个解形式(k1,k2,k3,。。。,kn),ki为第i次扔鸡蛋选择的楼层k。对于第一次扔鸡蛋,选择任意楼层k,鸡蛋碎还是不碎能发现两种不同的情况,状态也自然而然地出来了。再调整使得阶段有序,从第一层开始扔鸡蛋,也就能够顺其自然的定义dp数组。

其实关于状态这东西的选择,还是比较玄乎的,还是要通过刷题才能熟能生巧。

什么时候使用动态规划
1.最值问题(最优解)
2.问题规模大,使用递归中出现重叠子问题(也可剪枝)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值