- 贪心算法和DP
贪心算法:
定义:选择的贪心策略必须具有无后效应,寄某个状态之前的过程不会影响以后的状态,只与当前状态有关。
需要判断一下当前的最优解是不是最终的最优解。
最优子结构:当问题的最优解包含子问题的最优解的时候
局限性:
- 不能保证最后的结果一定是最佳的。
- 不能有来求最大或最小解问题
- 只能求满足某些约束条件的可行解的范围
上节课的dikistra,prim,krukal算法都是贪心算法。
上述算法也都有一些限制条件,就是为了约束最后的最优解的
大部分例题都能有DP解
例题:455: assign cookies。40min
小给小,大给大,可以sort后双指针遍历人和饼干,
122:Best time to but and Sell stockII
53:
134:gas
55: jump game。 只是求哪里开始可以完成目的可以贪心,但是求最小步骤不能用贪心算法。
总结:贪心算法主要是针对一维问题,不需要独立,DP是前后有关系,需要记录
- 动态规划
讲一个问题拆分成几个子问题,分别求解子问题。
步骤:
- 划分阶段,有序或者可排序(无后序性)
- 选择状态(无后行)
- 确定状态转移方程(根据上一阶段状态到处本阶段方程),确定了决策,状态转移方程也就出来了
- 写出规划方程,只需要写iterative的,不要写recursive。
重点:初始状态,和状态转移方程。
基本要素:
- 重叠子问题:用到之前很多数的结果,比如fibncci。
- 最优子结构
- 无后效性,保证之前的状态都已经更新完了才能拿来用,不能够用完这个数据后这个数据还在更新。 循环的顺序和倒序等等。
要学会问题归类:尤其是DP问题。例如二维DP,写两层循环。。
一般是最大利润或者最小误差等
例题:198:house robber。
初始条件:最大财务=0.
状态转移方程:每次到房子的时候利用和前面房子的关系,限制条件:不能连续抢。一般来说最后求最大财务数,每一步也要求最大财务书。
对每个房子状态两个:抢或者不抢,强的话:i-2的财务+当前财务。 不强的话:i-1的财务。
一般不用矩阵,因为只跟前一个或两个有关系。直接用几个变量表示就行。 矩阵的话一般是跟前n个有关。
- 卖股票系列:
状态转移,当前状态买,卖,不做。
初始值:一般来说是最大利润,
然后加上边界调节。有可能要加矩阵的维度,eg.cooldown
例题集合:1h24min
121.。。。。。。
贪心算法和动态规划的关系:
相同点
- 都是一种递推算法
- 均有局部最优解来推导全局最优解
不同点:
- 贪心算法(了解即可,自己做的时候看懂就好)因为要证明最优解还需要时间而且可能会错
每一步的贪心决策都无法改变,之前的最优解不做保留,每一步的最优解一定包括上一步的最优解
- 动态规划
(只要掌握动态规划就好,)
- 区间调度问题
最多区间调度问题,可以通过贪心算法1h48min
最大区间:只能用DP
例题:56 merge intervals. 2h07min
435
452
252
715 Hard
背包问题(leetcode 一般只有01背包和完全背包问题)。
2h17min,记得V的循环顺序
lintcode有很多例题