---------------------------------------------------------------------------------------------------------------------------------
分治
:分而治之,先解决子问题,再将子问题的解合并求出原问题。
贪心
:一条路走到黑,选择当下局部最优的路线,没有后悔药。
回溯
:一条路走到黑,手握后悔药,可以无数次重来。(英雄联盟艾克大招无冷却)。
动态规划
:上帝视角,手握无数平行宇宙的历史存档,同时发展出无数个未来。
---------------------------------------------------------------------------------------------------------------------------------
分治算法 Divide and Conquer
- 分解:将原问题分解成一系列子问题。
- 解决:递归求解各个子问题,若子问题足够小,则直接求解。
- 合并:将子问题的结果合并成原问题。
比较经典的应用就是归并排序 (Merge Sort)
以及快速排序 (Quick Sort)
等。我们来从归并排序理解分治思想,归并排序就是将待排序数组不断二分为规模更小的子问题处理,再将处理好的子问题合并起来。
贪心算法 Greedy
贪心算法
是动态规划
算法的一个子集,可以更高效解决一部分更特殊的问题。实际上,用贪心算法解决问题的思路,并不总能给出最优解。因为它在每一步的决策中,选择目前最优策略,不考虑全局是不是最优。
回溯算法 Backtracking
回溯算法本质上就是枚举,使用摸着石头过河的查找策略,还可以通过剪枝少走冤枉路。
思路
使用回溯法进行求解,回溯是一种通过穷举所有可能情况来找到所有解的算法。如果一个候选解最后被发现并不是可行解,回溯算法会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。究其本质,其实就是枚举。
动态规划 Dynamic Programming
虽然动态规划的最终版本 (降维再去维) 大都不是递归,但解题的过程还是离开不递归的。新手可能会觉得动态规划思想接受起来比较难,确实,动态规划求解问题的过程不太符合人类常规的思维方式,我们需要切换成机器思维。
使用动态规划思想解题,首先要明确动态规划的三要素。
动态规划三要素
重叠子问题
最优子结构
状态转移方程