一.递归:函数调用自身
二.递推:由递推公式求解,每个子问题均有确切的解,即每个阶段只有一个状态,静态过程。实现:1.自顶向下,递归,有时遇到重复计算的项,可以先存到外部数组,用到时先判断有没有计算过 2.自底向上,解决掉了存在重复用的项的问题 例子:斐波那契数列
三.分治:大问题分解为小问题,再整合成大问题。满足:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
实现:自顶向下或者自底向上 如:归并排序
四.动态规划:递推+决策=动态规划
目的:寻找最优解
把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解
两个特征:重复子问题,最优子结构
1.对于一般dp,看看能不能分解为多个阶段,而每个阶段的最优状态可以从之前的某个状态或某些状态直接得到而不管之前这个状态是如何得到的,即找到了状态转移方程,而且子结构也是最优的。(求解过程可能还出现了重复子问题)。就可以考虑dp。
间接:当考虑分治,发现可能子问题的解合并不为问题的解,而每个阶段的最优状态从之前的某个状态或某些状态直接得到,就可以考虑dp。或者分治可以做,但出现了重叠子问题,考虑dp。
一般采用自底向上,为了避免重复计算,而且体现出了最优子结构
也可采用自顶向下,但要像自顶向下递推一样,存储重复计算的值
2.对于树形dp等,采用自顶向下,不存在重叠子问题。有的树形dp可理解为分治
五:贪心
每一个阶段的最优状态均由上一阶段最优状态决定
注意:
动规和递推不同,dp是寻找最优解,每个阶段均可多个解,只不过选择最优的。而递推则是确定的,每个阶段为具体值