动态规划的思维其实就是递推的思维,而记忆型递归擅长解决重叠子问题不重复求解。
动态规划用于解决多阶段决策最优化问题
三要素:阶段 状态 决策。
两个条件:最优子结构(最优化原理),无后效性:当前状态是前面状态的完美总结
动规解题的一般思路:
是否可以用动态规划,否则用搜索。
模型匹配:多做经典题目,掌握经典模型。
一维:上升子序列模型,背包模型。
二维:最长公共子序列问题。
寻找规律:规模由大到小,或者由小到大,做逐步分析。
放宽条件或增加条件。
动规解题的一般过程:
找到过程演变中变化的量(状态),以及变化的规律(状态转移方程)。
确定一些初始状态,通常需要dp数组来保存。
利用状态转移方程,推出最终答案。
动规解题的解法:
自顶向下,递归。如果有重叠子问题,带备忘录。
自底向上,递推。
贪心算法和动态规划:
可以用局部最优解来推导全局最优解,即动态规划。
贪心:这一阶段的解,由上一阶段直接推导出。
动态规划:当前问题的最优解,不能从上一阶段子问题简单得出,需要前面多阶段多层子问题共同计算出,因此需要保留历史上求解过的子问题及其最优解。