【动态规划】leetcode309.zuijia买卖股票时机含冷冻期
作者:互联网
题目:
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
思路:
1.状态分类:
状态一:持有股票状态(当天买入股票,或者是之前就买入了股票然后没有操作)
保持卖出股票状态
- 状态二:在当天之前就卖出了股票,度过了冷冻期,一直没操作,今天保持卖出股票状态
- 状态三:当天卖出了股票
- 状态四:恰好处于冷冻期状态,但冷冻期状态不可持续,只有一天!
2.状态转移:
-
状态一:持有股票状态
(1)前一天就处于状态一:dp[i][0]=dp[i-1][0]
今天买入股票,则说明已度过冷冻期,对应两种状态:
(2)前一天处于状态四:dp[i][0]=dp[i-1][3]-prices[i]
(3)前一天处于状态二:dp[i][0]=dp[i-1][1]-prices[i]
故:dp[i][0]=max( dp[i-1][0], max(dp[i-1][3],dp[i-1][1])-prices[i] ) -
状态二:未持有股票状态,且已度过冷冻期
(1)前一天就处于状态二:dp[i][1]=dp[i-1][1]
(2)前一天处于状态四:dp[i][1]=dp[i-1][3]
故:dp[i][1]=max(dp[i-1][1],dp[i-1][3]) -
状态三:未持有股票状态,当天卖出了股票
(1)前一天处于状态一:dp[i][2]=dp[i-1][0]+prices[i]
故:dp[i][2]=dp[i-1][0]+prices[i] -
状态四:恰好处于冷冻期
(1)前一天处于状态三:dp[i][3]=dp[i-1][2]
故:dp[i][3]=dp[i-1][2]
解答:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n=len(prices)
if n==0:
return 0
dp=[[0]*4 for _ in range(n)]
dp[0][0]=-prices[0]
for i in range(1,n):
dp[i][0]=max(dp[i-1][0],max(dp[i-1][1],dp[i-1][3])-prices[i])
dp[i][1]=max(dp[i-1][1],dp[i-1][3])
dp[i][2]=dp[i-1][0]+prices[i]
dp[i][3]=dp[i-1][2]
return max(dp[n-1])
标签:状态,max,zuijia,leetcode309,股票,prices,冷冻,dp 来源: https://blog.csdn.net/jqq125/article/details/121417221