动态规划:力扣309. 最佳买卖股票时机含冷冻期

1、题目描述:

动态规划:力扣309. 最佳买卖股票时机含冷冻期_第1张图片

2、题解:

动态规划:
动态规划问题,弄清楚三点:
1、重复子问题;
2、最优子结构;
3、无后效性。

动态规划:

1、状态定义;

2、状态转移方程;

3、初始化;base case

4、输出;

5、思考状态压缩。

可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。
画dp table
先关注卖出的那一天,不关注冷冻期。只要在今天买入的时候,判断一下前一天是不是刚卖出就行。最关键的就是卖出的那一天。
状态定义:

三种情况:
1、不持股且当天没卖出(无交易)的收益:dp[i][0]
2、持股的收益 dp[i][1]
3、股票当天卖出了的收益(卖出后不持股),dp[i][2]

状态转移方程:

1、第i天不持股且当天没卖出(无交易)的收益:dp[i][0],也就是第i天我没有股票,没有卖出;也就是说从i-1天到i天没有买入股票,
所以第i-1天也一定是不持股的,有两种可能:
    1)本来第i-1天就不持股,也没卖出:
        dp[i-1][0]2)第i-1天卖出出去后的不持股:
        dp[i-1][2]
取两种情况的较大的值:也就是dp[i][0] = max(dp[i-1][0],dp[i-1][2])
2、第i天持股,有两种可能:
    1)要是第i-1天持股了,就继承:
        dp[i-1][1]
    2)第i-1天没持股且没有卖出,那么持的股票是今天刚买入的(这里不能是dp[i-1][2]-prices[i],因为刚卖出,不能立马买入,有冷冻期):
        dp[i-1][0]-prices[i]
3、第i天卖出后的不持股:这个只能来自第i-1持股了,第i天卖出:
    dp[i-1][1]+prices[i]

初始化

dp[0][0] = 0,本来就不持有,没有交易
dp[0][1] = -prices[0],第0天买入
dp[0][2] = 0,第0天买了又卖了,那么收益为0

最终是在不持股的两种状态中选择较大的
python代码如下:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        #动态规划
        n = len(prices)
        if n < 1:return 0
        dp = [[0] * 3 for _ in range(n)]
        dp[0][0] = 0
        dp[0][1] = -1 * prices[0]
        dp[0][2] = 0
        for i in range(1,n):
            dp[i][0] = max(dp[i-1][0],dp[i-1][2])
            dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i])
            dp[i][2] = dp[i-1][1] + prices[i]
        return max(dp[n-1][0],dp[n-1][2])

3、复杂度分析:

时间复杂度:O(N)
空间复杂度:O(N)

你可能感兴趣的:(LeetCode)