动态规划
两个性质
- 最优子结构:问题的最优解由其子问题的最优解组合而成;且子问题可独立求解;
- 重叠子问题:子问题的算法相同。
步骤
问题结构分析(数学语言描述);
递推关系建立;
自底向上计算,确立计算顺序;
最优方案追踪(记录数组回溯)
复杂度
复杂度取决于子问题的个数和子问题的复杂度。
类型
背包DP
线性DP
最长上升子序列 - LIS
递推关系:$F[i] =\max_{0 \le j < i, v[j] < v[i]}(F[j] + i)$
边界:$F[0] = 0$
最长公共子串 - LCS
递推关系:$F[i, j]=\max \left{\begin{array}{l}
F[i-1, j] \\
F[i, j-1] \\
F[i-1, j-1]+1 \quad \text { if } A[i]=B[j]
\end{array}\right.$
边界:$F[0,] = F[,0] = 0$
代码
1 |
|
数组DP
区间DP
最小编辑距离
钢铁切割
矩阵链乘法
例题
区别
- 与 分治:分治是独立的子问题
- 与 贪心:贪心自顶向下
Reference
[1].Dynamic Programming —— Geeksforgeeks