动态规划的一些见解
前两周开始刷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
而后者在确定可以只取一个物品一部分的情况下,确定使用贪心算法之后,就可以通过每次取单位重量价值最大的物品
放入背包。
总结:对贪心的使用还不熟悉,目前认为确定问题的贪心策略是解决问题的难点,一般的动归问题需要分析得到转移方程是编程
的前提。多刷刷题还是对自己的思路有帮助~