动态规划的一些见解

前两周开始刷DP问题的一些算法题,总结了如下的一些心得:

1、确定是否是一个DP问题:

a)以递归的思路来思考问题,能否列出一个转移方程

b)是否符合最优子结构,即原问题的最优解是否包含了子问题的最优解

c)是否有重叠的子问题,这也是自下而上迭代求解的基础

 

2、是否可以使用贪心算法优化求解:

贪心算法:顾名思义,就是在每一步做出当前最优的选择,但是还有一个后续条件是局部最优解能够构造

得到全局最优解。

 

举个栗子:

0-1背包和非0-1背包

前一个问题的描述是给定背包容量c,一个物品的重量数组w[],物品的价值数组cost[],问如何装载价值最大

后面的问题与前面一致,但是多出一个条件,即物品可以分割,得到单位重量的价值

从对两个问题的描述就可以看出来,第一个问题是符合DP思路的,假设当前总价值val[i][j],即当前价值为cost[i]的物品

装入到剩余容量为j的背包里之后的最大价值,其转移方程是

val[i][j] = max(val[i-1][j],val[i-1][j-w[i]]+cost[i]), if w[i] <=j

而后者在确定可以只取一个物品一部分的情况下,确定使用贪心算法之后,就可以通过每次取单位重量价值最大的物品

放入背包。

 

总结:对贪心的使用还不熟悉,目前认为确定问题的贪心策略是解决问题的难点,一般的动归问题需要分析得到转移方程是编程

的前提。多刷刷题还是对自己的思路有帮助~

 

posted @ 2019-04-01 14:32  快乐的打字员~  阅读(176)  评论(0编辑  收藏  举报