今天跟大家分享下算法思想中比较难的一种"动态规划",动态规划给人像是作战时常用的“迂回战术”,或者说是
游击战,在运动中寻找突破口。
一: 思想
首先要了解”动态规划“,必须先知道什么叫做”多阶段决策“,百科里面对这个问题解释的很全,我就load一段出来,
大家得要好好品味,好好分析。
上面图中最后一句话就定义了动态规划是要干什么的问题。
二:使用规则
现在我们知道动态规划要解决啥问题了,那么什么情况下我们该使用动态规划呢?
① 最优化原理(最优子结构性质):
如果一个问题的最优策略它的子问题的策略也是最优的,则称该问题具有“最优子结构性质”。
② 无后效性:
当一个问题被划分为多个决策阶段,那么前一个阶段的策略不会受到后一个阶段所做出策略的影响。
③ 子问题的重叠性:
这个性质揭露了动态规划的本质,解决冗余问题,重复的子问题我们可以记录下来供后阶段决策时
直接使用,从而降低算法复杂度。
三:求解步骤
① 描述最优解模型。
② 递归的定义最优解,也就是构造动态规划方程。
③ 自底向上的计算最优解。
④ 最后根据计算的最优值得出问题的最佳策略。
四:与其他算法的差异
① 递归: 递归采用的是“由上而下”的解题策略并带有可能的”子问题“重复调用,时间复杂度自然高。
而”动态规划“采用”自下而上“并带有临时存储器保存上一策略的最优解,空间换时间。
② 分治: 同样两者都是将问题划分为很多的子问题,不同的是”动态规划“中各子问题是相互联系的。
③ 贪心: 要注意的是贪心算法每走一步都是不可撤回的,而动态规划是在一个问题的多种策略中寻找
最优策略,所以动态规划中前一种策略可能会被后一种策略推翻。
五:举例
动态规划中,最经典最著名的例子莫过于”背包问题“,现有:
苹果: 1kg 12¥
梨子: 1kg 3¥
葡萄: 1kg 10¥
板栗: 1kg 25¥
现有一个背包,只能装3kg水果,那么如何得到物品价值最大化?