重点:最优子结构,重叠子问题,五步曲
目录
1. 动态规划题型
总的来说,动态规划有如下几类题型:
(1)基础题目:如斐波那契数,爬楼梯,不同路径,整数拆分等;
(2)背包问题:01背包,完全背包,多重背包等;
(3)打家劫舍问题:
(4)投票问题:只能买卖一次,可以买卖若干次等;
(5)子序列问题:连续,不连续,编辑距离等;
2. 什么是动态规划
动态规划(Dynamic Programming),简称DP,如果一个问题有很多重叠子问题,并且问题的解来源于很多子问题的解,那么这个题目使用动态规划来做是最有效的。其特点有以下方面:
(1)最优子结构;
(2)重叠子问题;
动态规划和贪心算法:二者都需要最优子结构,即大问题的整体最优解可通过一系列局部最优解得到。但区别是,动态规划当前问题依赖于子问题的解,贪心不依赖。所以有的问题贪心得不到最优解,DP一定能得到。
——动态规划一步一个选择,当前问题依赖于子问题的解,当前的解是根据上一个结果推出来的;贪心一步一个选择,但不依赖于子问题的解,直接选择;
——动态规划的条件是子问题的重叠性质,所以记录下来以后会用到;贪心是最优子结构性质加贪心性质,即整体最优解可以通过一系列局部最优得到;
——动态规划自底向上,贪心自顶向下。
动态规划和分治法:二者都是将问题分解成若干子问题。但DP的子问题不是相互独立的,所以需要记录下来。而分治法的子问题是相互独立的,所以不需要记录(如归并排序)。
——分治法用递归,DP用for循环嵌套,同时记录结果。
3. 动态规划的解题步骤
动态规划具有比较鲜明的特征,即最优子结构和重叠子问题。其状态转移公式(递推公式)很重要,拆分为以下五步:
(1)确定dp数组以及下标的含义;
(2)确定递推公式;
(3)dp数组如何初始化;
(4)确定遍历顺序;
(5)举例推导dp数组;