题目链接
题目描述
实现代码
分析:假设f[i]表示第i个位置的最大利润,每个位置都是对应了两个状态:持有和未持有,而未持有又对应着两个状态:之前就未持有和今天刚卖的,因此可以将其划分为下面几个状态对应关系:
- f[i][0]:在i位置持有股票
- f[i][1]:在i位置未持有股票,且不是今天卖出的,不算冷冻期
- f[i][2]:在i位置未持有股票,且是今天卖出的,算冷冻期
这样划分的话,每个状态的最大利润就跟i-1位置的最大利润能扯上关系了:
- f[i][0] = max(f[i-1][0], f[i-1][1] - price[i])
- f[i][1] = max(f[i-1][1], f[i-1][2])
- f[i][2] = f[i][0] + price[i]
实现代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
if n == 1:
return 0
'''
每个i位置都对应三种状态:
1. 当前位置持股 对应f[i][0]
2. 当前位置未持股且不是冷冻期(即不是今天卖的) 对应f[i][1]
3. 当前位置为持股且是冷冻期(即是今天卖的) 对应f[i][2]
'''
# f = [[-prices[0], 0, 0]] + [[0] * 3 for _ in range(n - 1)]
f_zero = -prices[0]
f_one = 0
f_two = 0
first = True
for idx, price in enumerate(prices):
if first:
first = False
continue
temp_zero = f_zero
temp_one = f_one
temp_two = f_two
f_zero = max(temp_zero, temp_one - price)
f_one = max(temp_one, temp_two)
f_two = temp_zero + price
# f[idx][0] = max(f[idx - 1][0], f[idx - 1][1] - price)
# f[idx][1] = max(f[idx - 1][1], f[idx - 1][2])
# f[idx][2] = f[idx - 1][0] + price
return max(f_one, f_two)