动态规划
1. 大纲
2. 入门经典例题
3. 什么情况下使用动态规划?
4. 什么情况下不使用动态规划?
-
求出所有 具体 的方案而非方案 个数
http://www.lintcode.com/problem/palindrome-partitioning/ -
输入数据是一个 集合 而不是 序列
http://www.lintcode.com/problem/longest-consecutive-sequence/ -
暴力算法的复杂度已经是多项式级别
1、动态规划擅长与优化指数级别复杂度(2^n, n!)到多项式级别复杂度(n^2, n^3)
2、不擅长优化n3到n2 -
则 极不可能 使用动态规划求解
5. 动规四要素 vs 递归三要素
6. 面试中常见的动态规划类型
7. 坐标型动态规划
Trip:
初始化一个二维的动态规划时就去初始化第0行和第0列
7.1 最大最小值问题
状态:f[x][y]从起点走到x,y的最短路径
转移方程:f[x][y] = min(f[x-1][y], f[x][y-1]) + A[x][y]
初始化:f[i][0] = sum(0,0 ~ i,0);f[0][i] = sum(0,0 ~ 0,i)
答案:f[n-1][m-1]
例题:
【动态规划——坐标型-最大最小值问题】Lintcode 110. 最小路径和
7.2 方案总数问题
状态:f[x][y]从起点到x,y的路方案数
转移方程: (研究倒数第一步) f[x][y] = f[x - 1][y] + f[x][y - 1]
初始化:f[0][i] = 1(对于第一行只能往右走,所以方案数就是1);
f[i][0] = 1(对于第一列只能往下走,方案书也是1);
答案:f[n-1][m-1]
例题:
【动态规划——坐标型-方案总数问题】Lintcode 114. 不同的路径
8. 接龙型动态规划(一维的坐标型动态规划)
例题:
【动态规划——接龙型(一维坐标型)】Lintcode 76. 最长上升子序列
【动态规划——接龙型(一维坐标型)】Lintcode 602. 俄罗斯套娃信封
9. 动态规划只能记录一种最优方案,无法记录所有的最优方案
你可以记录这个状态的最优值是从哪过来的。如果你要求出所有的最优方案,可以先用动态规划求出最优方案,并标记每个方案离起点或者终点的最优距离是什么,然后再用深度优先搜索把所有的最优方案搜出来。