题目描述:
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
示例 2:
提示:
1 <= prices.length <= 5000
0 <= prices[i] <= 1000
解题思路图:
注意:该题需要好好理解状态转化,比一般的题较难一些
AC代码:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [0, 0, 0]
n = len(prices)
dp[0] = -prices[0]
for i in range(1, n):
pre_buy, pre_sell = dp[0], dp[1]
# 买入状态:之前已买入 or 今天买入
# 买入状态表示保证今天之后是股票已经买入
dp[0] = max(dp[0], dp[2]-prices[i])
# 卖出状态:之前已卖出 or 今天卖出
# 卖出状态表示保证今天之后是股票已经卖出
dp[1] = max(dp[1], pre_buy+prices[i])
# 冷冻期状态:
dp[2] = pre_sell
return max(dp[1], dp[2])