心路历程:
这道题的建模和股票问题一样,只不过需要在状态上增加一个处于冻结期;
状态:1第i天;2第i天持有股票的状态(持有,不持有被冻结,不持有未被冻结)
动作:买入、卖出、不操作
返回值:当前状态下的收益
注意的点:
1、注意思考清楚所有的状态转移情况,当第i天处于持有状态时,第i-1天可能有两个状态:不持有不冻结or持有;
2、最后一天一定是手里不持有收益最大,所以是max(dp(n-1, 0), dp(n-1, 1))而不是max(dp(n-1, 0), dp(n-1, 1), dp(n-1, 2)).
解法:动态规划
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
if n == 0: return 0
@cache
def dp(i, j): # 第i天的状态,j \in {0 ,1 ,2} 代表不持有且无冻结、不持有被冻结、持有
if i == 0 and j == 2: return -prices[i]
elif i==0 and j <= 1: return 0
if j == 0: return max(dp(i-1, 0), dp(i-1, 1))
elif j == 1: return dp(i-1, 2) + prices[i]
else: return max(dp(i-1, 0) - prices[i], dp(i-1, 2)) # 这块少考虑了一种情况!
return max(dp(n-1, 0), dp(n-1, 1))