回溯算法的本质就是 穷举,只能通过 剪枝 来优化。
回溯法解决的问题可以抽象成 树形结构。
因为回溯法解决的都是 在集合中递归查找子集,集合的大小 就构成了 树的宽度,递归的深度 就构成了 树的深度。
解决的问题:
- 组合问题:N个数里面按一定规则找出k个数的集合
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 棋盘问题:N皇后,解数独等
组合 是 不强调 元素顺序 的;排列 是 强调 元素顺序。
贪心的本质是选择每一阶段的 局部最优,从而达到 全局最优。
适合解决 有很多重叠子问题。
动态规划中 每一个状态 一定是由 上一个状态 推导出来的,这一点区别于贪心。