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

题目分析

这个题目的题眼在于状态转换的比较多.

我认为最好的一种解法是使用了三个一维DP数组维护状态.

  1. buy_dp
  2. sell_dp
  3. cool_dp

使用了三个一维DP数组的好处

  1. 空间换复杂度, 更多的空间, 可以使我们的状态转化更容易的表达.

buy_dp的状态

  1. buy_dp[i]的状态可以从cool_dp[i-1]buy_dp[i-1]来转化过来.
  2. buy_dp[i]buy_dp[i-1]的空状态.

代码自解释.

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        n = len(prices)
        
        if n == 0:
            return 0
        # 状态解释
        # buy_dp[i] 表示的是在 i 进行买入操作的最大收益
        # sell_dp[i] 表示的是在 i 进行卖出操作的最大收益
        # cool_dp[i] 表示的是在 i 处于冷冻期的时候的最大收益
        buy_dp = [0]*n
        sell_dp = [0]*n
        cool_dp = [0]*n
        
        # 状态初始化
        
        buy_dp[0] = -prices[0]
        sell_dp[0] = 0
        cool_dp[0] = 0
        
        for i in range(1,n):
            # buy_dp[i] = buy_dp[i-1]表示的是空操作
            # buy_dp[i] = cool_dp[i-1]-prices[i-1] 
            # 表示的是从冷却期状态 转化出来, 开始买入
            buy_dp[i] = max(buy_dp[i-1],cool_dp[i-1]-prices[i])
            # sell_dp[i] = sell_dp[i-1] 表示的是空操作
            # sell_dp[i] = buy_dp[i-1]+prices[i]
            # 表示状态转换, 从买入状态进入卖出状态
            sell_dp[i] = max(sell_dp[i-1], buy_dp[i-1]+prices[i])
            
            # cool_dp[i] = cool_dp[i-1] 表示空操作
            # cool_dp[i] = sell_dp[i-1] 表示的是状态转换
            cool_dp[i] = max(cool_dp[i-1], sell_dp[i-1])
        # 最后的状态是卖出或者cooldown 的最大值
        return max(sell_dp[-1],cool_dp[-1])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 简介:最近大火的DBA,他的核心理念是帮投资者提高投资认知、帮优质项目增加曝光率,那么他是如何设计游戏规则以实现这...
    长风少侠阅读 357评论 0 4
  • 最近几天,王宝强离婚事件引起轩然大波,朋友圈、空间已经被刷屏,各种说辞,各种猜疑,各种八卦,各种议论,各种吐槽。殊...
    永远的小丸子呀阅读 91评论 1 1
  • 1 小强:老师,今天我把小森打出血了! 老师:为什么? 小强:我要让他把昨天打我流的血还回来! 2 小林:老师,你...
    那年木槿花开阅读 598评论 40 26

友情链接更多精彩内容