188.买卖股票的最佳时机IV
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/
代码随想录
https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课
309.最佳买卖股票时机含冷冻期
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/
代码随想录
https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html#思路
714.买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
代码随想录
https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html#思路
188.买卖股票的最佳时机IV
题解思路
- 在限制次数的基础上,将状态矩阵的长度也变成变量k。即买卖k次 有\(2*k+1\) 个不同状态。除了第一次以后,奇数为买,偶数为卖
- dp[i][j]:第[i]个价格时第j个状态。j对应第j//2次买卖,奇数为买,偶数为卖;
- 初始化:奇数为买;偶数为0(一个股票怎么买卖都不会盈利)
- 易错:dp[i][0] 第0个状态不能取最大值,否则无法记录交易量的值了。可能有超过k次的交易出现。
题解代码
点击查看代码
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
if len(prices)<2:
return 0
dp = [[0]*(2*k+1) for _ in range(len(prices))]
for i in range(2*k+1):
if i%2!=0:
dp[0][i] = -prices[0]
for i in range(1,len(prices)):
###不用修改dp[0]
for j in range(1,2*k+1):
if 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][-1]
309.最佳买卖股票时机含冷冻期
题解思路
- 状态比较复杂:最终总结出有4个状态;
- 根据状态图 总结出dp推导过程
题解代码
点击查看代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [[0]*4 for _ in range(len(prices))]
## 初始化
dp[0][0] = -prices[0]
## 递推
for i in range(1,len(prices)):
dp[i][0] = max(dp[i-1][0],dp[i-1][3]-prices[i],dp[i-1][1]-prices[i])
# 到买的状态有3种情况:
# 1.冷冻期过后就买(买完一过冷冻期就买)
# 2.保持抛出状态后买;
# 3.维持之前买的状态;
dp[i][1] = max(dp[i-1][1],dp[i-1][3])
## 到卖出状态:只有冷冻期过后买,或者保持之前的卖出状态
dp[i][2] = dp[i-1][0]+prices[i]
## 达到今天就卖出;不考虑和前面的比较
dp[i][3] = dp[i-1][2]
## 一卖出就进入冷冻期 不考虑其他可能;
return max(dp[-1])
714.买卖股票的最佳时机含手续费
题解思路
- 只是在买卖的基础上增加了手续费;
题解代码
股票问题总结:
- 题目分类
- 分为:
- 买卖次数一次和多次:只有买卖状态
- 最多买k次:因为相互有连续,所以有 \(2*k+1\) 个状态
- 冷冻期:因为有冷冻期,所以有买 卖 卖动作 冷冻期 4个状态
- 手续费:只在多次的基础上,增加了一个计算
点击查看代码
class Solution:
def maxProfit(self, prices: List[int], fee: int) -> int:
dp = [[0]*2 for _ in range(len(prices))]
dp[0][1] = -prices[0]
for i in range(1,len(prices)):
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]-fee)
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i])
return dp[-1][0]