动态规划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
posted on
浙公网安备 33010602011771号