动态规划
dp定义为第i天是否持有股票的最大收益,由于存在冷静期买入要发生在前两天且不持有的状态下
所以base case是dp[0][0] = 0 dp[0][1] = -price[i]
dp[1][0] = max(dp[0][1]+price[i],dp[0][0])
dp[1][1] = max(dp[0][1], dp[0][0]-price[i])
转移:
dp[i][0] = max(dp[i-1][1]+prices[i],dp[i-1][0])
dp[i][1] = max(dp[i-1][1],dp[i-2][0]-prices[i]) #上上轮没持有才能买,或者上一轮持有不卖
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
#dp定义为第i天是否持有股票的最大收益,由于存在冷静期买入要发生在前两天且不持有的状态下
#所以base case是dp[0][0] = 0 dp[0][1] = -price[i]
#dp[1][0] = max(dp[0][1]+price[i],dp[0][0])
#dp[1][1] = max(dp[0][1], dp[0][0]-price[i])
n = len(prices)
dp = [[0]*2 for i in range(n)]
dp[0][0] = 0
dp[0][1] = -prices[0]
if n > 1:
dp[1][0] = max(dp[0][1]+prices[1],dp[0][0])
dp[1][1] = max(dp[0][1], dp[0][0]-prices[1])
for i in range(2,n):
dp[i][0] = max(dp[i-1][1]+prices[i],dp[i-1][0])
dp[i][1] = max(dp[i-1][1],dp[i-2][0]-prices[i])
return dp[n-1][0]
还可以分成四种状态:根据是否冷冻,是否持有划分
- 持有在冷冻期(不存在)2. 持有
- 非持有在冷冻期 4. 非持有在非冷冻期
所以存在三种
f[i][0] = max(f[i - 1][0], f[i - 1][2] - prices[i]) 持有 可以从上一轮持有非冷冻期,上一轮非持有在非冷冻期转移
f[i][1] = f[i - 1][0] + prices[i] 非持有在冷冻期
f[i][2] = max(f[i - 1][1], f[i - 1][2]) 非持有在非冷冻期
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
n = len(prices)
# f[i][0]: 手上持有股票的最大收益
# f[i][1]: 手上不持有股票,并且处于冷冻期中的累计最大收益
# f[i][2]: 手上不持有股票,并且不在冷冻期中的累计最大收益
f = [[-prices[0], 0, 0]] + [[0] * 3 for _ in range(n - 1)]
for i in range(1, n):
f[i][0] = max(f[i - 1][0], f[i - 1][2] - prices[i])
f[i][1] = f[i - 1][0] + prices[i]
f[i][2] = max(f[i - 1][1], f[i - 1][2])
return max(f[n - 1][1], f[n - 1][2])