核心思想
动态规划基础,解决一旦有了尝试方法,怎么搞定后续的一整套实现:
讲解:一维、二维、三维动态规划,从递归开始到最终版本,包括空间压缩技巧
高频动态规划问题:子数组累加和问题与扩展 最长递增子序列问题与扩展
动态规划常见模型 & 尝试经验,核心在于怎么尝试?思路、经验太多了,如下都是经典尝试:
背包dp 区间dp 树型dp
状压dp 数位dp
动态规划常见技巧:
优化枚举 ,获得具体方案 ,根据数据量猜解法
动态规划:
一些递归有重复计算,可以用空间记录返回值来避免重复计算
同时还有相关的一整套原理和技巧的总和
什么样的递归可以变成动态规划?
设计的可变参数类型简单,不比int类型更复杂的递归,可以变成动态规划
如果递归过程中的路径信息比较复杂(回溯),那么不能或者没有必要改成动态规划
虽然有路径信息,但是路径信息比较简单的话,也可以改成动态规划
重叠子结构:递归计算的逻辑是一样的
最优子问题:大问题依靠小问题的最优而来或者组合而来
无后效性:设计的可变参数简单
动态规划的大致过程:
1、想出设计优良的递归尝试
2、记忆化搜索 (从顶到底的动态规划)
3、严格位置依赖的动态规划 (从底到顶的动态规划)
4、进一步优化空间,也就是空间压缩
5、进一步优化枚举行为
尝试策略 = 转移方程
推荐从尝试入手,最符合自然智慧
进而分析位置依赖,分析位置依赖时多根据具体的例子画图,建立空间感
动态规划方法的复杂度:O (状态数量 * 每个状态的枚举代价)
尝试方法的优劣由题目具体的数据量决定,先确定靠谱尝试,然后再去做后续实现