update dp

This commit is contained in:
ranwenjie
2021-11-15 01:44:14 +08:00
parent ec09f22df4
commit 81e6ec3f53
3 changed files with 57 additions and 6 deletions
+24 -3
View File
@@ -25,7 +25,7 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
* 凑零钱问题
* 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java)
* 打家劫舍问题 : num[i] 代表第i个房子中的现金数目,从房子中取钱的最大数目,约束是相邻房子的钱不能同时取出
* 接雨水问题 :
* 接雨水问题 :num[i]表示柱子高度,计算下雨之后能接多少雨水
* 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。
* 最小编辑距离
* 最长递增子序列 (LIS Longest Increasing Subsequence),如`【5,6,7,3,2,8】` 最长子序列 `【5,6,7,8】`, 输出4
@@ -56,8 +56,6 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
### DP VS 分治法
与[分治法](分治算法.md)不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。
@@ -105,6 +103,29 @@ for 状态1 in 状态1的所有取值:
```Java
//递归解法,处理重叠子问题, 使用 dp[amount+1] 备忘录
int coinChange2(int[] coins, int amount) {
int[] dp = new int[amount + 1];
// 数组大小为 amount + 1,初始值也为 amount + 1
// 为啥 dp 数组初始化为 amount + 1 呢,因为凑成 amount 金额的硬币数最多只可能等于 amount(全用 1 元面值的硬币),所以初始化为 amount + 1 就相当于初始化为正无穷
Arrays.fill(dp, amount + 1);
// base case
dp[0] = 0;
// 外层 for 循环在遍历所有状态的所有取值
for (int i = 0; i < dp.length; i++) {
// 内层 for 循环在求所有选择的最小值
for (int coin : coins) {
// 子问题无解,跳过
if (i - coin < 0) {
continue;
}
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
return (dp[amount] == amount + 1) ? -1 : dp[amount];
}
```