最佳买卖股票时机含冷冻期
给定一个整数数组prices
,其中第 prices[i]
表示第 i
天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: prices = [1,2,3,0,2]
输出:3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:
输入: prices = [1]
输出: 0
提示:
1 <= prices.length <= 5000
0 <= prices[i] <= 1000
这道题多了一个冷冻期,其实也就是dp数组多了一个冷冻的状态而已;
我们假设:
- dp[i][0]代表无操作(这个状态有没有均可,为了写代码方便而已)
- dp[i][1]代表持有(买入)股票的最大利润
- dp[i][2]代表不持有(卖出)股票最大利润
- dp[i][3]代表冷冻期最大利润
状态转移方程:
持有股票之前可能是无状态,也可能是冷冻期,还有可能是已经持有(买入)了,所以:
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3] - prices[i], dp[i - 1][0] - prices[0])
不持有出票之前可能是持有(买入),也可能是已经不持有(卖出)了,所以状态转移方程如下:
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i])
而冷冻期之前只有一种状态,就是不持有(卖出)
dp[i][3] = dp[i - 1][2]
所以整体代码如下;
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [[0] * 4 for _ in range(len(prices))]
'''
0:无操作
1:持有
2:卖出
3:冷冻
'''
dp[0][1] = -prices[0]
for i in range(1, len(prices)):
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3] - prices[i], dp[i - 1][0] - prices[0])
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i])
dp[i][3] = dp[i - 1][2]
return dp[-1][2]