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

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

coder

coder

码农

​关注他

1 人赞同了该文章

1.题目描述

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例

输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
解释: 
长度最长的公共子数组是 [3, 2, 1]。

2.题目分析

很明显的一道动态规划问题,首先分析问题,每天都状态有两种,未持有股票dp1持有股票两种状态dp2,创建两个列表代表两种状态的盈利情况,分析状态转移方程

状态转移方程

首先是当天未持有股票状态dp1,当天未持有股票的话,则分为两种情况:昨天也未持有,或者昨天持有股票,今天卖出。由此得出状态转移方程:

dp1[i] = max(dp[i - 1], dp2[i - 1]+price[i])

然后是当天持有股票状态dp2,当天持有股票的话,则分为两种情况,一是昨天持有股票,今天未卖;二是昨天未持有股票,今天买入

注意第二种情况,由于存在冷冻期,今天买入则今天一定没有在冷冻期,要确定今天没有在冷冻期,则昨天不能卖出股票,也未持有股票。dp1[i-1] 只能表示昨天没有持有股票,不能表示昨天没有卖出股票,所以要根据前天的状态来确定今天不在冷冻期。

前天未持有股票的话,则今天一定不再冷冻期。由此可得状态转移方程

dp2[i] = max(dp2[i - 1], dp1[i - 2] - price[i])

同样的由于冷冻期的存在,则若在第一天,第二天(i =1和i=2)时,当天持有股票的利润一定是 0 - price[i],因为之前的时间不足以购买股票

初始条件

dp1 = [0] * len(price) dp2 = [0] * len(price) dp2[0] = - price[0]

非常容易理解,未持有股票的初始条件都是0,若第0天持有股票,则当天的利润为 -price[0]

源代码

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        
        if len(prices) <= 1:
            return 0
        
        if len(prices) == 2:
            count = prices[1] - prices[0]
            return count if count > 0 else 0
        
        n = len(prices)
        dp1 = [0] * n
        dp2 = [0] * n
        dp2[0] = - prices[0]

        for i in range(1, n):
            dp1[i] = max(dp1[i-1], dp2[i-1] + prices[i])
            temp = 0
            if i >= 2:
                temp = dp1[i-2]
            dp2[i] = max(dp2[i-1], temp - prices[i])
            
        return max(dp1[n-1], dp2[n-1])

编辑于 2018-10-07

猜你喜欢

转载自blog.csdn.net/jfkidear/article/details/89395568
今日推荐