题目:
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
思路:
动态规划
考虑三个状态,买入,卖出,不操作(包括冷冻期)
买入利润的更新可以包括不操作,卖出利润的更新可以包括不操作。
建立两个动态数组,分别表示当天买入或者不操作的利润和当天卖出或者不操作的利润。
买入或者不操作的利润更新是看当天不操作的利润大还是买入的利润大,选择大的更新,如果当天不操作,利润就是前一次买入的利润,如果当天买入,那因为有冷冻期,所以前一天就不能卖出,卖出利润是前两天的,用这个利润减去当前价格,就是当天购入的收入。
卖出或者不操作的利润更新是看当天不操作的利润大还是卖出的利润大,选择大的更新,如果不操作,那利润就是上一次卖出的利润,如果卖出,利润就是上一次买入的利润加上这次卖出的价格。
遍历完毕,返回最大利润。
注意,写对两个动态数组索引0和1位置上的利润。
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices) < 2:
return 0
buy = [0] * len(prices)
sell = [0] * len(prices)
buy[0] = -prices[0]
buy[1] = max(-prices[1],buy[0])
sell[0] = 0
sell[1] = max(0,prices[1]-prices[0])
for i in range(2,len(prices)):
buy[i] = max(buy[i-1],sell[i-2]-prices[i])
sell[i] = max(sell[i-1],buy[i-1]+prices[i])
return max(sell[-1],buy[-1],0)