动态规划合集

动态规划分为如下几个模型:

  1. 最常用的DP模型:背包问题
  2. 线性DP
  3. 区间DP、计数类DP
  4. 数位统计DP、树形DP
  5. 状态压缩DP
  6. 记忆化搜索

动态规划解题的一般思路

  1. 将原问题分解为子问题

    • 把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决。
    • 子问题的解一旦求出就会被保存,所以每个子问题只需求解一次。
  2. 确定状态

    • 将和子问题相关的各个变量的一组取值,称之为一个“状态”。一个“状态”对应于一个或多个子问题, 所谓某个“状态”下的“值”,就是这个“状态”所对应的子问题的解。
    • 所有“状态”的集合,构成问题的“状态空间”。“状态空间”的大小,与用动态规划解决问题的时间复杂度直接相关。
    • 整个问题的时间复杂度是状态数目乘以计算每个状态所需时间。
  3. 确定一些初始状态(边界状态)的值

    • 以“数字三角形”为例,初始状态就是底边数字,值就是底边数字值。
  4. 确定状态转移方程

    • 定义出什么是“状态”,以及在该“状态”下的“值”后,就要找出不同的状态之间如何迁移――即如何从一个或多个“值”已知的 “状态”,求出另一个“状态”的“值”(递推型)。
    • 状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。

动态规划优质博客链接:

最简单的DP概念:如何教四岁孩子理解动态规划?知乎
有图有详解:夜深人静写算法(二)- 动态规划
翻译自TopCoder的一篇文章:动态规划:从新手到专家
数学归纳法、贪心、DP对比以及DP讲解:六大算法之三:动态规划

学习过程随笔:

在学习DP上我经过了这四个阶段:

  • python实现的《算法图解》,算是一个简单的入门
  • 算法基础课的DP这章的视频,看视频讲总比自己找文章简单
  • 《算法竞赛入门经典(第二版)》
  • CSDN及各种博客上各路大佬的讲解

你可能感兴趣的:(算法基础课学习记录)