update dp
This commit is contained in:
@@ -57,6 +57,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
|
||||
|
||||
### DP VS 回溯法
|
||||
|
||||
DP 和 回溯法 都会用到递归
|
||||
|
||||
动态规划的暴力求解阶段就是回溯算法。只是有的问题具有重叠子问题性质,可以用 dp table 或者备忘录优化,将递归树大幅剪枝,这就变成了动态规划;而有些问题没有重叠子问题,也就是[回溯算法](回溯法.md)问题了,复杂度非常高是不可避免的
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
|
||||
|
||||
|
||||
## 代码框架
|
||||
|
||||
```python
|
||||
@@ -43,6 +42,33 @@ def backtrack(路径, 选择列表):
|
||||
> n 个不重复的数,全排列共有 n! 个
|
||||
|
||||
|
||||
```Java
|
||||
// 路径:记录在 track 中
|
||||
// 选择列表:nums 中不存在于 track 的那些元素
|
||||
// 结束条件:nums 中的元素全都在 track 中出现
|
||||
void backtrack(int[] nums, LinkedList<Integer> track) {
|
||||
// 触发结束条件
|
||||
if (track.size() == nums.length) {
|
||||
res.add(new LinkedList(track));
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < nums.length; i++) {
|
||||
// 排除不合法的选择
|
||||
if (track.contains(nums[i]))
|
||||
continue;
|
||||
|
||||
// 做选择
|
||||
track.add(nums[i]);
|
||||
|
||||
// 进入下一层决策树
|
||||
backtrack(nums, track);
|
||||
// 取消选择
|
||||
track.removeLast();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 八皇后问题
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
在 `回归` 阶段,获得最简单问题的解后,逐级返回,依次得到稍微复杂情况的解,知道获得最终的结果
|
||||
|
||||
1) 确定递归公式 , 比如 斐波那契数列 问题中的 `fib(n)=fib(n-1)+fib(n-2)`
|
||||
2) 确定边界条件
|
||||
2) 确定边界条件 bad case
|
||||
|
||||
> 自顶向下的递归,自底向上是迭代
|
||||
|
||||
|
||||
Reference in New Issue
Block a user