动态规划(1):DP基础
Last updated on May 5, 2025 pm
本文为SJTU-AI2615算法课程的知识点复习,主要复习内容为动态规划基础,包括斐波那契数列、DAG最短路径、最长递增子序列、编辑距离、背包问题等。
动态规划
- 核心思想:
- 将问题分解为重叠子问题,通过存储子问题解(记忆化)避免重复计算
- 要求问题具有最优子结构(全局最优解包含局部最优解)
- 关键步骤:
- 定义子问题
- 合并重复子问题(转化为DAG)
- 按拓扑序求解子问题
斐波那契数列
递归解法
- 时间复杂度:
记忆化搜索
- 时间复杂度:
动态规划
- 时间复杂度:
DAG 最短路径
问题描述
- 输入:有向无环图(DAG)、起点 、边权函数
- 输出: 到所有顶点的最短路径
动态规划思路
- 时间复杂度:
正确性证明
- 数学归纳法
最长递增子序列
问题描述
- 输入:序列
- 输出:最长递增子序列长度(LIS)的长度,LIS 指 ,其中
动态规划思路
- 子问题:
LIS[i]
表示以 结尾的 LIS 长度
- 时间复杂度:
编辑距离
问题描述
- 输入:字符串
X
和Y
- 输出:将
X
转换为Y
的最小操作次数(插入、删除、替换)
问题转化
- 等价问题:找到最好的对齐方式
动态规划思路
-
子问题:
ED[i, j]
表示X[1..i]
和Y[1..j]
之间的编辑距离 -
状态转移:
- 时间复杂度:
背包问题
问题描述
- 输入: 件物品,第 件物品代价 ,价值 ,背包容量
- 输出:选择物品子集,使得总代价不超过 且总价值最大
动态规划思路
- 子问题:
f[i, w]
表示考虑前 件物品,使用 容量时的最大价值 - 状态转移:
时间复杂度
- ,但并不是多项式
- 考虑输入规模 :表示输入所需的比特数
- ,
总结
注:本文中所有图片均来自张宇昊老师的课程PPT。
动态规划(1):DP基础
https://cny123222.github.io/2025/04/03/动态规划-1-:DP基础/