*123.买卖股票的最佳时机III
- 考点
- 动态规划
- 我的思路
- 无思路
- 视频讲解关键点总结
- 关键点在于分为4个状态:第一次持有,第一次不持有,第二次持有,第二次不持有
- 关键点2:最后直接返回最后一天的第二次不持有状态的dp值即可,因为即便第一次卖出就取得了最大值,在同一天时由于可以二次买卖,所以第二次不持有状态的dp值会同步更新,因此第二次不持有状态的dp值一定大于等于第一次不持有状态的dp值
- 我的思路的问题
- 无思路
- 代码书写问题
- 无
- 可执行代码
class Solution:def maxProfit(self, prices: List[int]) -> int:dp = [[0] * 4 for _ in range(len(prices))]dp[0][0] = -prices[0]dp[0][1] = 0dp[0][2] = -prices[0]dp[0][3] = 0for i in range(1, len(prices)):dp[i][0] = max(dp[i - 1][0], -prices[i])dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i])dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i])return dp[-1][3]
*188.买卖股票的最佳时机IV
视频讲解:https://www.bilibili.com/video/BV16M411U7XJ
https://programmercarl.com/0188.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIV.html
- 考点
- 动态规划
- 我的思路
- 和上一题思路一致,只需要在初始化和递推公式时进行条件判断即可
- 视频讲解关键点总结
- 和上一题思路一致
- 我的思路的问题
- 无
- 代码书写问题
- 无
- 可执行代码
class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:dp = [[0] * (2 * k) for _ in range(len(prices))]for i in range(2 * k):if i % 2 == 0:dp[0][i] = -prices[0]else:dp[0][i] = 0for i in range(1, len(prices)):for j in range(2 * k):if j == 0:dp[i][j] = max(dp[i - 1][0], -prices[i])elif j % 2 == 0:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i])else:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i])return dp[-1][2 * k - 1]