update dp

This commit is contained in:
ranwenjie
2021-11-10 14:27:03 +08:00
parent b3672ec2f0
commit 5a0d23faa8
4 changed files with 87 additions and 2 deletions
+1
View File
@@ -57,6 +57,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
### DP VS 回溯法
DP 和 回溯法 都会用到递归
动态规划的暴力求解阶段就是回溯算法。只是有的问题具有重叠子问题性质,可以用 dp table 或者备忘录优化,将递归树大幅剪枝,这就变成了动态规划;而有些问题没有重叠子问题,也就是[回溯算法](回溯法.md)问题了,复杂度非常高是不可避免的
+27 -1
View File
@@ -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();
}
}
```
## 八皇后问题
+1 -1
View File
@@ -6,7 +6,7 @@
在 `回归` 阶段,获得最简单问题的解后,逐级返回,依次得到稍微复杂情况的解,知道获得最终的结果
1) 确定递归公式 , 比如 斐波那契数列 问题中的 `fib(n)=fib(n-1)+fib(n-2)`
2) 确定边界条件
2) 确定边界条件 bad case
> 自顶向下的递归,自底向上是迭代