动态规划是什么
将原问题分解成多阶段决策的子问题,再采取自底向上的方法求解。
动态规划三个条件:最优子结构,无后效性,重叠子问题
最优子结构:一个问题的最优解包含了子问题最优解。反过来说,即子问题的最优解能够推出原问题的最优解,为动态规划提供了问题分解的依据。
无后效性:未来与过去无关,只与现在有关。即对于某个阶段能够写出一个关于当前状态转移方程,使其转移到下一个阶段。是多阶段决策的桥梁。
重叠子问题:出现重复的子问题。动态规划自底向上的方法就能够避免该问题出现,在自底向上中,子问题只会被计算一次并存储起来(若有需要被存储,滚动数组不必)。
动态规划与递归
同:
其实我们在用递归的时候不难发现,一个能用递归形式解决的问题(若问题的解不止一个且有最优的一个),其必定满足最优子结构。递归天生就将一个原问题分解成子问题,且子问题一定是为原问题做出贡献的,否则也没必要这么分解。
其次,递归的解法也是满足无后效性的。回想在递归的解法中,将问题分解成子问题的时候,并不考虑子子问题是如何,这不就是反着来看无后效性吗?未来是原问题,现在是子问题,过去是子子问题。
递归需要找到递归的边界,问题的出口。动态规划也需要找到basecase,即把最小的问题先填到表上,后续的问题才能慢慢解决。
递归需要递归函数,动态规划需要状态转移方程。递归函数和状态转移方程本质都是将问题转移的方法。
异:
递归是自顶向下的分析。过程是先自顶向