update dp

This commit is contained in:
ranwenjie
2021-11-14 22:42:14 +08:00
parent afc5b7ef2e
commit 4d67d29412
7 changed files with 161 additions and 26 deletions
+32 -11
View File
@@ -8,7 +8,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
动态规划算法的关键在于解决冗余,以空间换时间的技术,需要存储过程中的各种状态。可以看着是`分治算法`+`解决冗余`
动态规划算法也可以说是 `记住求过的解来节省时间`
动态规划算法也可以说是 `记住求过的解来节省时间` ; 比如 Fibonacci数列 中,先直接从最小,最简单的 f(1) , f(2) 开始,自低向上一直到 f(20) , 这就是动态规划的思路
【初始状态】→【决策1】→【决策2】→…→【决策n】→【结束状态】
@@ -21,16 +21,20 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
动态规划的核心思想就是穷举求最值; 动态规划问题的一般形式就是`求最值`,动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说:
* 最长递增子序列 (LIS Longest Increasing Subsequence)
* 最小编辑距离
* 0-1 背包问题
* 凑零钱问题
* 股票问题
* 接雨水问题
* Fibonacci数列
* Fibonacci数列 [代码参考这里 递归](./递归.md)
* 凑零钱问题
* 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java)
* 二叉树的最近公共祖先 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/tree/CommonParent.java)
* 链表翻转 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/link/ReverseLink.java)
* 接雨水问题
* 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。
* 二叉树的最近公共祖先
* 链表翻转
* 最小编辑距离
* 最长递增子序列 (LIS Longest Increasing Subsequence)
* 0-1 背包问题
[更多动态规划案例代码实现参考deep-in-java])(https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/framework/dynamic)
```
@@ -69,7 +73,7 @@ DP 和 回溯法 都会用到递归
* 划分问题
* 状态
* 状态转移方程, 这一步最为困难
* 状态转移方程, 这一步最为困难 ; 暴力解法就是状态转移方程
* 状态压缩
@@ -87,6 +91,23 @@ for 状态1 in 状态1的所有取值:
## 凑零钱问题
凑零钱问题[视频解读参考这里]()
如果使用贪心策略,并不能得到最优解。
```Java
```