贪心递归和动态规划
Posted 爆米花好美啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心递归和动态规划相关的知识,希望对你有一定的参考价值。
贪心
每个阶段的最优状态都是由上一个阶段的最优状态得到的(最优子结构)而不管上一状态是如何得到的(无后效性)
分治策略(递归)
将原问题分解为若干个规模较小但类似于原问题的子问题(Divide),「递归」的求解这些子问题(Conquer),然后再合并这些子问题的解来建立原问题的解。因为在求解大问题时,需要递归的求小问题,因此一般用「递归」的方法实现,即自顶向下。
动态规划
每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到(最优子结构)而不管之前这个状态是如何得到的(无后效性)
举例:
每个阶段的最优状态由上一阶段的某些(所有)状态有关,而不管上一段的各种状态是怎么得到的
多段图
如果你发现一个状态转移有后效性,很简单,把会引起后效性的参数作为状态描述的一部分放进去将其区分开来就可以了:
我记得在leetcode中一道题,利用三种颜色的油漆给n个房子刷,要求相邻不能为同一颜色,每个房子刷每个油漆cost不同,求最小cost。这里面无法用一个基于房子编号一维的数组来代表状态,因为每个房子所刷的油漆会影响到下一个房子的决策,也就是有后效性,所以干脆把油漆的颜色也当作一个状态变量构建一个二维的dp状态数组dp[n][3],状态方程为i<-0 to 2 dp[n][i] =cost[n][i]+min(dp[n-1][(i+1)%3],dp[n-1][(i+2)%3]) 这样就把当前房子分别用三种颜色的状态都表示出来了,最后求min(dp[n-1][0],dp[n-1][1],dp[n-1][2])得到最终结果。
动态规划其实和分治策略是类似的,也是将一个原问题分解为若干个规模较小的子问题,递归的求解这些子问题,然后合并子问题的解得到原问题的解。 区别在于这些子问题会有重叠,一个子问题在求解后,可能会再次求解,于是我们想到将这些子问题的解存储起来,当下次再次求解这个子问题时,直接拿过来就是。 其实就是说,动态规划所解决的问题是分治策略所解决问题的一个子集,只是这个子集更适合用动态规划来解决从而得到更小的运行时间。 即用动态规划能解决的问题分治策略肯定能解决,只是运行时间长了。因此,分治策略一般用来解决子问题相互对立的问题,称为标准分治,而动态规划用来解决子问题重叠的问题,是自底向上的
1.动态规划法试图只解决每个子问题一次
2.一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。


以上是关于贪心递归和动态规划的主要内容,如果未能解决你的问题,请参考以下文章