1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| '''题解:DP 状态: 1. 当前第i天持有股票:dp[i][0] 2. 当前第i天不持有股票,处于冷冻期(第i天刚卖出股票):dp[i][1] 3. 当前第i天不持有股票,不处于冷冻期(第i天没有卖出股票):dp[i][2] dp数组含义: dp[i][j]代表第i天j状态下的最大收益 状态转移: 1. 第i天持有的股票可能是第i-1天已经持有的:dp[i-1][0] 也可能是第i天刚好买入的(此时i-1天只有不处在冷冻期第i天才能买入):dp[i-1][2] dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i]) 2. 第i天刚卖出股票意味着i-1天一定持有股票: dp[i][1] = dp[i-1][0] + prices[i] 3. 第i天不持有股票且当天没有卖出股票: dp[i][2] = max(dp[i-1][1], dp[i-1][2]) 边界条件: dp[0][0] = -prices[0] dp[0][1] = 0 dp[0][2] = 0 最终结果: n = len(prices) res = max(dp[n-1][0], dp[n-1][1], dp[n-1][2]) 空间优化: 第i天状态只由i-1天状态决定,因此可以用三个变量分别记录i-1天时三个状态的最大收益: 状态1: state1_stock 状态2: state2_selling 状态3: state3_selled ''' from typing import List class Solution: def maxProfit(self, prices: List[int]) -> int: prices_len = len(prices) if prices_len == 0 or prices_len == 1: return 0 state1, state2, state3 = -prices[0], 0, 0 for i in range(prices_len): state1_new = max(state1, state3 - prices[i]) state2_new = state1 + prices[i] state3_new = max(state2, state3) state1, state2, state3 = state1_new, state2_new, state3_new return max(state1, state2, state3)
sol = Solution() prices = [1,2,3,0,2] print(sol.maxProfit(prices))
|