Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程。就是说,如果这个题目实际上是类似于Divide and conquer或者说是DFS,但是在计算过程中有很多重复计算同样的过程的话,那么就可以用Dynamic prgramming/记忆化搜索来完成。基本就是利用空间来简化时间复杂度的过程。
可以/很有可能使用Dynamic programming的条件,满足之一即可。
1. Maximum/Minimum
2. Yes/No. True/False
3. Count(*)
一定不是Dynamic programming的条件,满足之一即可。
1. all 具体方案。
2. input是集合或者跟position无关。
3. move 4 directions in 二维数组。(或者说不是固定方向,有可能会有循环)
动态规划4要点:
1. 状态 state
mem[i][j] 代表什么,ex. 代表s1前i个characters和s2前j个characters。
2. Function
mem[i][j] = mem[i - 1][j] if ****
3. Initialize
usually mem[0][0] / mem[i][0]/ mem[0][j]
4. 答案
mem[n]/mem[n - 1]/mem[m][n]
在这里将Dynamic programming分为几类。
1. 矩阵Dynamic programming/Matrix DP
state: mem[i][j] 走到坐标(x, y) 的状态。
[LeetCode] 120. Triangle _Medium tag: Dynamic Programming
[LeetCode] 64. Minimum Path Sum_Medium tag: Dynamic Programming
[LeetCode] 62. Unique Paths_ Medium tag: Dynamic Programming
[LeetCode] 63. Unique Paths II_ Medium tag: Dynamic Programming
2. Sequence DP
state: mem[i] 前i个位置
mem 的length 设为n
[LeetCode] 70. Climbing Stairs_ Easy tag: Dynamic Programming
[LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
[LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming
3. 分割DP
state: mem[i] 前i个character 是否可行
mem 的length 设为n + 1,因为要考虑到前0个character,也就是empty string。
[LeetCode] 132. Palindrome Partitioning II_ Hard tag: Dynamic Programming
[LeetCode] 139. Word Break_ Medium tag: Dynamic Programming
4. Two sequences DP
state: mem[i][j] 表明s1的前i个characters, 配上s2的前j 个characters。
mem 的length 设为(n + 1)* (m + 1),因为要考虑到前0个character,也就是empty string。
需要初始化 mem[i][0], mem[0][j]
[LintCode] 77. Longest common subsequences_ Medium tag: Dynamic Programming
[LeetCode] 72. Edit Distance_hard tag: Dynamic Programming
[LeetCode] 115. Distinct Subsequences_ Hard tag: Dynamic Programming
[LeetCode] 97. Interleaving String_ Hard tag: Dynamic Programming
原文地址:https://www.cnblogs.com/Johnsonxiong/p/10793639.html