动态规划的使用场景与题型分类 - 图1
动态规划的使用场景与题型分类 - 图2

坐标型动态规划

dp[i]表示从起点到坐标i的最优值/方案数/可行性
dp[i][j]表示从起点到坐标i,j的最优值/方案书/可行性
代表题:Triangle、Unique Paths

前缀型之划分型

dp[i]表示之前i个字符的最优值/方案数/可行性
dp[i][j]表示前i个字符分为j个部分的最值/方案数/可行性
代表题:Word Break, Word Break III

前缀型之匹配型

dp[i][j]表示第一个字符串的前i个字符匹配上第二个字符串的前j个字符的最优值/方案数/可行性
代表题:Longest Common Subsequence, Wildcard Matching

区间型

dp[i][j]表示i~j的最优值/方案数/可行性
代表题:Stone Game, Burst Ballons

背包型

dp[i][j]表示前i个物品里选出一些物品组成和为j的大小的最优值/方案数/可行性
代表题:Backpack系列

01背包——第一种状态表示

状态state
dp[i][j]表示前i个数里挑若干个数是否能组成和为j
方程function
dp[i][j] = dp[i - 1][j] or dp[i - 1][j - A[i]] 如果j >= A[i]
dp[i][j] = dp[i - 1] 如果 j < A[i]
初始化initialize
dp = [0][0] = true
dp[0][1…m] = false
答案answer
使得dp[n][v], 0 <= v <= m 为true的最大v

三种不适用DP的场景

求所有的具体方案
只求出一个具体方案还是可以用DP来做的

输入数据的无序的
背包类动态规划不适用此判断条件,除去背包问题后方向:逐行生成数据

暴力算法的复杂度已经是多项式级别
动态规划擅长与优化指数级别复杂度到多项式级别复杂度
不擅长优化n^3到n^2