[python]leetcode(309). Best Time to Buy and Sell Stock with Cooldown

原创 2017年10月06日 21:52:44

problem

Say you have an array for which the ith element is the price of a
given stock on day i.

Design an algorithm to find the maximum profit. You may complete as
many transactions as you like (ie, buy one and sell one share of the
stock multiple times) with the following restrictions:

You may not engage in multiple transactions at the same time (ie, you
must sell the stock before you buy again). After you sell your stock,
you cannot buy stock on next day. (ie, cooldown 1 day)

Example:

prices = [1, 2, 3, 0, 2]
maxProfit = 3
transactions = [buy, sell, cooldown, buy, sell]

solution1

这种序列优化问题通常使用动态规划的解法,这里特殊的地方在于它有三种状态,而一般的序列优化问题只有两种,例如最长递增子序列问题中,每一个元素又有被选择和未被选择两种,所以这个问题的递推过程要稍微复杂一些。

我的解法如下:

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """

        def helper(prices, start, dp):
            if len(prices) < 2:
                return 0
            ans = 0
            for i in range(start, len(prices)):
                for j in range(i + 1, len(prices)):
                    if dp[j+2] != -1:
                        ans = max(ans, prices[j] - prices[i] + dp[j+2])
                    else:
                        ans = max(ans, prices[j] - prices[i] + helper(prices, j+2, dp))
            dp[start] = ans

            return ans

        dp = [-1] * (len(prices)+2)
        return helper(prices, 0, dp)

这个解法的思想就是把原来起始为0的序列转化为prices[i]买入,prices[j]卖出,加上j+2起始的序列最大值。这样我们就可以写出递推方程了。

这样的时间复杂度为O(n3)

solution2

对于这种多状态问题可以使用多个数组来记录不同的状态为结尾的最优值。

令sell[i] 表示第i天未持股时,获得的最大利润,buy[i]表示第i天持有股票时,获得的最大利润。

这样就可以进行递推了,
buy[i] = max(sell[i-2] - price, buy[i-1])
sell[i] = max(buy[i-1] + price, sell[i-1])

这样的时间复杂度为O(n),同时由于递推过程最多只用到前两天的数据,所以时间复杂度为O(1)

总结

虽然都是动态规划,但是选择好变量表示状态,然后找出递推方程很重要。

对于多状态的问题可以分状态表示多个相互递推的方程组。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

LeetCode笔记:309. Best Time to Buy and Sell Stock with Cooldown

使用动态规划计算股票买入、卖出、休息三种操作后的最大收益

Leetcode 309. Best Time to Buy and Sell Stock with Cooldown

题目: Say you have an array for which the ith element is the price of a given stock on day i. ...

[Leetcode] 309. Best Time to Buy and Sell Stock with Cooldown 解题报告

题目: Say you have an array for which the ith element is the price of a given stock on day i. ...

Leetcode 309. Best Time to Buy and Sell Stock with Cooldown

这道题初开始有一些不知所措,所以参考了一下网上的状态转移方程。题目Say you have an array for which the ith element is the price of a g...

【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown

题目: Say you have an array for which the ith element is the price of a given stock on day i.Design a...

LeetCode 309. Best Time to Buy and Sell Stock with Cooldown(股票交易)

原题网址:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ Say you have an ...

【LEETCODE】309-Best Time to Buy and Sell Stock with Cooldown

Say you have an array for which the ith element is the price of a given stock on day i. Design an ...

LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

题目309. Best Time to Buy and Sell Stock with Cooldown思路动态规划,改成最优子结构:方法一buyOrSell[i]:表示第i天一定卖的最大利润 递推关...

Leetcode: 309. Best Time to Buy and Sell Stock with Cooldown 有冷却机制的最优炒股问题

Leetcode: 309. Best Time to Buy and Sell Stock with Cooldown 有冷却机制的炒股问题-作者: Eswai (eswai@foxmail.com...
  • eswai
  • eswai
  • 2017-01-12 19:25
  • 95

LeetCode解题报告 309. Best Time to Buy and Sell Stock with Cooldown[medium]

有限状态机 三个状态 f0[i]:第i天过后处于状态0时的最大收益 f1[i]:第i天过后处于状态1时的最大收益 f2[i]:第i天过后处于状态2时的最大收益 f0[1]=0 f1[1]=-...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)