深搜:
关键在于解决“当下该如何做”,“下一步如何做”与“当下如何做”是一样的。
void dfs(int step){
判断边界
尝试每一种可能for(){
继续下一步dfs(step + 1);
}
返回
}
分治法(divide and conquer):
把原问题分解成规模较小的问题
从小问题的解构建出原问题的解
T(N) = 2 * T(N / 2) + O(N) --> T(N) = O(NlogN)
回溯法(backtracking):
在每一步进行试探,
发现一个可能的局部解,则进行下一步试探
当前所有可能都无解,则返回上一步试探
迭代实现、地柜实现
贪心法(greedy algorithm):
在解决问题的每个阶段,都选择当下最优的方案。
“当下最优”即“局部最优”
全局最优 == 局部最优 --> 贪心法能获得全局最优解
动态规划(dynamic programming):
与“分治法”有相似之处:问题分解
最优化原理(最优子结构)
无后效性
子问题不是独立的(有重叠),要避免重复计算
使用表代替递归、自底向上递推
1133

被折叠的 条评论
为什么被折叠?



