Files
Learn-Algorithms/8 Algorithms Analysis/动态规划.md
T
2021-10-11 10:35:23 +08:00

1.5 KiB
Raw Blame History

动态规划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...)

####基本步骤

  1. 划分问题
  2. 选择状态
  3. 确定决策并写出状态转移方程
  4. 写出规划方程

最长递增子序列

最长递增子序列(LIS Longest Increasing Subsequence)

其它案例

  • 最短路径
  • 0-1 背包问题