0309最佳买卖股票时机含冷冻期

最佳买卖股票时机含冷冻期
问题描述:
0309最佳买卖股票时机含冷冻期_第1张图片
最终版本代码(不懂可以看未优化版本代码以及下方解释)

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        len_price = len(prices)
        # 不同的dp表示我们在这一天所要进行的不同操作
        dp_buy = -prices[0]  # 表示在该天买入
        dp_sell = 0  # 表示在该天卖出
        dp_freeze = 0  # 表示该天无操作(为冷冻期或者无买进卖出行为)且手中无剩余股票
        max_buy = dp_buy  # 最后一次操作为买入时的最大收益
        max_sell = 0  # 最后一次操作为出售时的最大收益
        for i in range(1, len_price):
            dp_buy = dp_freeze - prices[i]  # 如果我们想在第i天进行买入操作,则在第i-1天我们应该为冷冻期或者无买进卖出行为
            dp_freeze = max_sell  # 如果我们要在第i天无操作,则第i-1天应该为无操作或者冷冻期,所以其值应该与当前最大出售收益相同
            dp_sell = max_buy + prices[i]  # 如果我们在第i天卖出,则前i-1天内必须有剩余股票即最后一次操作为买入
            max_buy = max(max_buy,dp_buy)
            max_sell = max(max_sell,dp_sell)
        return max_sell

未优化存储空间代码

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        len_price = len(prices)
        dp_sell = [0 for _ in range(len_price)]  # 表示最后一次操作为卖出的收益
        dp_buy = [0 for _ in range(len_price)]  # 表示最后一次操作为买入的收益
        dp_freeze = [0 for _ in range(len_price)]  # 表示最后一次操作为冷却或无操作的最大收益
        dp_buy[0] = -prices[0]  # 初始化
        dp_sell[0] = 0
        dp_freeze[0] = 0
        for i in range(1, len_price):
            dp_buy[i] = dp_freeze[i-1] - prices[i]  # 在第i天买入则i-1天应为冷却期或无操作
            dp_freeze[i] = max(dp_sell[:i])  # 要在第i天为无操作且保证利润最大,则上一次操作应该为卖出,所以为max(dp_sell[:i])
            dp_sell[i] = max(dp_buy[:i]) + prices[i]  # 要在第i天卖出且保证在收益最大,则应找上一次操作为买入且买入价格最低
        return max(dp_sell[-1], dp_freeze[-1])  # dp_sell中记录的是每天为卖出情况时的最大收益,dp_freeze为每天无操作或冷却期的最大收益
        										# 且dp_freeze[i]代表的就是前i-1天中的最大利润,因此只需将dp_sell[i]与dp_freeze[i]比较即可

你可能感兴趣的:(leetcode,python,leetcode)