1.5 KiB
1.5 KiB
动态规划DP
动态规划(英语:Dynamic programming,简称 DP),通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。复杂问题不能分解成几个子问题,而分解成一系列子问题 ;
DP通常基于一个递推公式及一个(或多个)初始状态,当前子问题解由上一次子问题解推出。
动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是分治算法+解决冗余
使用动态规划算法的问题的特征是子问题的重叠性,否则动态规划算法不具备优势
动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是求最值,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。
- 状态
- 状态转移方程, 这一步最为困难
- 状态压缩
DP 解题模板
# 初始化 base case
dp[0][0][...] = base
# 进行状态转移
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for ...
dp[状态1][状态2][...] = 求最值(选择1,选择2...)
####基本步骤
- 划分问题
- 选择状态
- 确定决策并写出状态转移方程
- 写出规划方程
最长递增子序列
最长递增子序列(LIS Longest Increasing Subsequence)
其它案例
- 最短路径
- 0-1 背包问题