diff --git a/problems/0123.买卖股票的最佳时机III.md b/problems/0123.买卖股票的最佳时机III.md index d480da83..3cd7ab26 100644 --- a/problems/0123.买卖股票的最佳时机III.md +++ b/problems/0123.买卖股票的最佳时机III.md @@ -120,7 +120,7 @@ dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]); 大家可以看到红色框为最后两次卖出的状态。 -现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。 +现在最大的时候一定是卖出的状态,而两次卖出的状态现金最大一定是最后一次卖出。如果想不明白的录友也可以这么理解:如果第一次卖出已经是最大值了,那么我们可以在当天立刻买入再立刻卖出。所以dp[4][4]已经包含了dp[4][2]的情况。也就是说第二次卖出手里所剩的钱一定是最多的。 所以最终最大利润是dp[4][4] diff --git a/problems/0322.零钱兑换.md b/problems/0322.零钱兑换.md index 45974112..7505f5ec 100644 --- a/problems/0322.零钱兑换.md +++ b/problems/0322.零钱兑换.md @@ -209,19 +209,19 @@ class Solution: def coinChange(self, coins: List[int], amount: int) -> int: '''版本一''' # 初始化 - dp = [amount + 1]*(amount + 1) + dp = [float("inf")]*(amount + 1) dp[0] = 0 # 遍历物品 for coin in coins: # 遍历背包 for j in range(coin, amount + 1): dp[j] = min(dp[j], dp[j - coin] + 1) - return dp[amount] if dp[amount] < amount + 1 else -1 + return dp[amount] if dp[amount] != float("inf") else -1 def coinChange1(self, coins: List[int], amount: int) -> int: '''版本二''' # 初始化 - dp = [amount + 1]*(amount + 1) + dp = [float("inf")]*(amount + 1) dp[0] = 0 # 遍历物品 for j in range(1, amount + 1): @@ -229,7 +229,7 @@ class Solution: for coin in coins: if j >= coin: dp[j] = min(dp[j], dp[j - coin] + 1) - return dp[amount] if dp[amount] < amount + 1 else -1 + return dp[amount] if dp[amount] != float("inf") else -1 ``` diff --git a/problems/背包理论基础01背包-2.md b/problems/背包理论基础01背包-2.md index 816719c3..3c5b45c1 100644 --- a/problems/背包理论基础01背包-2.md +++ b/problems/背包理论基础01背包-2.md @@ -139,7 +139,7 @@ dp[1] = dp[1 - weight[0]] + value[0] = 15 倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。 -(这里如果读不懂,就在回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) +(这里如果读不懂,就再回想一下dp[j]的定义,或者就把两个for循环顺序颠倒一下试试!) **所以一维dp数组的背包在遍历顺序上和二维其实是有很大差异的!**,这一点大家一定要注意。