动态规划Dynamic Programming

code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路

理解动态规划:

递归与动态规划的联系与区别 -> 记忆化搜索 -> 本质:动态规划

什么时候使用动态规划:

使用动态规划的三个条件

1.求最大值最小值/判断是否可行/统计方案个数 2.求所有方案/集合而不是序列 3.2^n优化成n^2的题目

不使用动态规划的三个条件

1.求出所有具体的方案而非方案个数 2.输入数据是一个集合而不是序列 3.暴力算法的复杂度已经是多项式级别(不适合把n^3优化成n^2)

动规四要素:

状态state:

灵感,创造力,存储小规模问题的结果。F什么什么代表什么什么(最难的部分)。dp的难点主要是状态的设计,所以推荐从dfs入手,dfs的状态就是和dp的状态差不多的,dfs(x,y) dp[x][y],搜索的参数就是一种状态

 

方程function:

状态之间的联系,怎么通过小的状态,来算大的状态

初始化Initialization:

最极限的小状态是什么,起点

答案Answer:

最大的那个状态是什么,终点

与递归进行比较:

递归三要素:

定义(状态): 1.接受什么参数 2.做了什么事 3.返回什么值

拆解(方程): 如何将参数变小

出口(初始化): 什么时候可以直接return

 

多重循环 vs 记忆化搜索

多重循环:优点:正规,大多数面试官可以接受,存在空间优化可能性。缺点:思考有难度

记忆化搜索:优点:容易从搜索算法直接转化过来。有的时候可以节省更多的时间。缺点:递归

能用DP的肯定也可以用DFS做,DP是不做重复的事情,那DFS就会出现大量做重复的事情,所以DFS效率低

相关题目:

45. Jump Game II

55. Jump Game

62. Unique Paths

63. Unique Paths II

64. Minimum Path Sum

70. Climbing Stairs

72. Edit Distance

97. Interleaving String

115. Distinct Subsequences

120. Triangle

131. Palindrome Partitioning

132. Palindrome Partitioning II

139. Word Break

140. Word Break II

174. Dungeon Game

300. Longest Increasing Subsequence

741. Cherry Pickup

https://leetcode.com/problems/dungeon-game/

面试中常见的动态规划类型

坐标型动态规划15

state:

f[x] 表示我从起点走到坐标x 代表的是一个个体,当前x位置的f(x) 值

f[x][y] 表示我从起点走到坐标x,y…

function: 研究走到x,y这个点之前的一步

Initialize: 起点

answer:终点

P.S.初始化一个二维的动态规划时,就去初始化第0行和第0列

序列型动态规划30多用于String

state: f(i) 代表的是一个整体,前i个
function: f[i] = f[j] ….j是i之前的一个位置
initialize: f[0]
Answer: f[n]
一般answer是f(n)而不是f(n-1):因为对于n个字符,包含前0个字符(空串), 前1个字符…前n个字符。
方案总数(最多/最少)和yes or no是一个意思

双序列动态规划 30 两个sequence

state: f[i][j] 代表了第一个sequence的前i个数字/字符,配上第二个sequence的前j个
function: f[i][j] = 研究第i个和第j个的匹配关系
initialize: f[i][0] 和 f[0][i]
Answer: f[n][m]
N = s1.length()
M = s2.length()

LCS/方案总数大部分都是DP,唯一不是的是N-Queen

划分型动态规划 30

背包型动态规划 10

区间型动态规划 5

 posted on 2019-01-16 09:15  hardcorexbc  阅读(239)  评论(0)    收藏  举报