动态规划是通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划的基本方法是递推,递推的理解对动态规划起着至关重要的作用。
- 递推
递推说白了就是在知道前i-1项的值得前提下,计算第i项的值。
2、记忆化搜索
记忆化搜索和递推不同,他是直接计算第i项需要用到第j项的值(j<i)时去查表,如果表里已经有第j项的话,则直接取出来用,否则递归计算第j项,并且计算完毕后把值记录在表中。记忆化搜索在求解多维的情况下比递推更加方便。
3、状态和状态转移
在介绍递推和记忆化搜索的时候一般都会涉及到状态,他表示解决了某一问题的中间结果,这是一个比较抽象的概念,无论是递推还是记忆化搜索,首先要设计出合适的状态,然后通过状态的特征建立状态转移方程。
- 最优化原理和最优子结构
如果问题的最优解包含的子问题的解也是最优的,就称该问题具有最优子结构,满足最优化原理。
- 决策和无后效性
一个状态演变到另一个状态,往往是通过决策来进行的。有了决策就会进行状态转移。而无后效性,就是一旦某一个状态确定后,它之前的状态无法对它之后的状态产生影响。
动态规划的经典模型
1、线性模型
线性模型的是动态规划中最常用的模型,上文讲到的最长单调子序列就是经典的线性模型,这里的线性指的是状态的排布是呈线性的。
2、区间模型
区间模型的状态表示一般为d[i][j],表示区间[i, j]上的最优解,然后通过状态转移计算出[i+1, j]或者[i, j+1]上的最优解,逐步扩大区间的范围,最终求得[1, len]的最优解。
3、背包模型
a.0/1背包
b.完全背包
c.多重背包
4、状态压缩模型
状态压缩的动态规划,一般处理的是数据规模较小的问题,将状态压缩成k进制的整数,k取2时最为常见。
5、树状模型
树形动态规划(树形DP),是指状态图是一棵树,状态转移也发生在树上,父结点的值通过所有子结点计算完毕后得出。
以上的几种模型感觉基本都不太理解,感觉理解的最透彻的也就是背包型的了,其他的只是在网上见到过但是不怎么理解。
以上就是我对动态规划的一点理解,感觉很水。