动归不是某种具体的算法,而是一种思想,核心在于把大问题转化为小问题,利用小问题的解推判断大问题的解
动态规划很像递推,不同的是,递推求的是一个数据,对数据进行操作
动态规划求的是最优的状态,最优的方案,通过
就像上楼梯问题,假设f数组表示从0走到x的方案数,那么fn怎么进行推测呢?只需要f[n] = f[n-1] + f[n-2],这就是此问题的递推式
我们用大事化小小事化了的思想,解决这类上楼梯问题,为什么大事可以化为小呢?因为大事小事都要一样的形式,如果满足这个要求那么我们每遇到问题都可以坚决表达,这种局面叫做状态,设计完动态直接利用小来求大,就可以把题目做出来
确定状态,求出f数组的意义表示,然后我们需要将小状态推出大状态,这个过程为状态转移,这个式子为状态转移方程,我们需要考虑这个局面从哪过来的
动归还可以用另一种设计转移的思路,当前状态解已知需要利用这个解去更新他能走到的状态,也就是我从哪里来,我到哪里去
一个是对于没有求出解的状态,利用能走到的他的状态得出它的解,一个是对于一个求好的状态那它去更新它能走到的地方
记忆化搜索和按顺序递推式动归的两种高效实现方法,记忆化搜索有时候更节省时间,空间,因为不可能达到的状态是不会被搜索到的
决策类的动归,需要满足两个原则1.大问题的最优解,一定是从小问题最优解出来的;2.无后效应,现在的决策只与过去的结果有关,和过去的决策无关,也就是只看最后的值,而不看这个值是怎么来的
总结:dp三连,1我是谁,设计状态;2我从哪里来;3我到哪里去
Dp实现,按顺序递推,记忆化搜索