第四节 动态规划上
总结:
1.什么时候用动态规划?
满足下面三个条件之一,极有可能是使用动态规划:
求最大值最小值;
判断是否可行;
统计方案个数(而不是给出每个具体的方案);
2.什么时候不使用动态规划?
满足下面三个条件之一,极不可能是使用动态规划:
求出所有具体方案而非方案个数;
输入数据是一个集合而不是序列;(背包问题除外)
暴力方法复杂度已经是多项式级别;
3.动规四要素
(1)状态
灵感,创造力,存储小规模问题的结果
(2)方程
状态之间的联系,怎么通过小的状态,来算大的状态
(3)初始化
最极限的小状态是什么, 起点
(4)答案
最大的那个状态是什么,终点
4.六类动规(每种类型的状态定义比较固定):
坐标型动态规划
序列型动态规划
双序列动态规划
划分型动态规划
背包型动态规划
区间型动态规划
5.坐标型动态规划
特点:路径,小人走
状态模板: f[x] 表示我从起点走到坐标x……
f[x][y] 表示我从起点走到坐标x,y……
lintcode例子:114,115 unique paths i and ii,
111 climbing stairs,
110 Minimun path sum,
109 Triangle,
116,117 Jump game i and ii,
76 Longest Increasing Subsequence.
6.tips
(1)贪心法不需要学,因为没有通用性,“背诵”以下几个经典的题目即可:
http://www.lintcode.com/en/problem/majority-number/
http://www.lintcode.com/en/problem/create-maximum-number/
http://www.lintcode.com/en/problem/jump-game-ii/
http://www.lintcode.com/en/problem/jump-game/
http://www.lintcode.com/en/problem/gas-station/
http://www.lintcode.com/en/problem/delete-digits/
http://www.lintcode.com/en/problem/linked-list-cycle-ii/
http://www.lintcode.com/en/problem/linked-list-cycle/
(2)动态规划与分治的本质区别:子问题之间有无交集。