代码随想录算法训练营第44天 | 动态规划9:买卖股票总结

188.买卖股票的最佳时机IV
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/
代码随想录
https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课
309.最佳买卖股票时机含冷冻期
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/
代码随想录
https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html#思路
714.买卖股票的最佳时机含手续费
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
代码随想录
https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html#思路

188.买卖股票的最佳时机IV

题解思路

  • 在限制次数的基础上,将状态矩阵的长度也变成变量k。即买卖k次 有\(2*k+1\) 个不同状态。除了第一次以后,奇数为买,偶数为卖
  • dp[i][j]:第[i]个价格时第j个状态。j对应第j//2次买卖,奇数为买,偶数为卖;
  • 初始化:奇数为买;偶数为0(一个股票怎么买卖都不会盈利)
  • 易错:dp[i][0] 第0个状态不能取最大值,否则无法记录交易量的值了。可能有超过k次的交易出现。

题解代码

点击查看代码
class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        if len(prices)<2:
            return 0
        dp = [[0]*(2*k+1) for _ in range(len(prices))]

        for i in range(2*k+1):
            if i%2!=0:
                dp[0][i] = -prices[0]


        for i in range(1,len(prices)):
            ###不用修改dp[0]
            for j in range(1,2*k+1):
                if j%2==0:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+prices[i])
                else:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]-prices[i])
        return dp[-1][-1]

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

题解思路

  • 状态比较复杂:最终总结出有4个状态;
    image
  • 根据状态图 总结出dp推导过程

题解代码

点击查看代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp = [[0]*4 for _ in range(len(prices))]
		## 初始化
        dp[0][0] = -prices[0]
		## 递推
        for i in range(1,len(prices)):
            dp[i][0] = max(dp[i-1][0],dp[i-1][3]-prices[i],dp[i-1][1]-prices[i])
            # 到买的状态有3种情况:
            #     1.冷冻期过后就买(买完一过冷冻期就买) 
            #     2.保持抛出状态后买;
            #     3.维持之前买的状态;
            dp[i][1] = max(dp[i-1][1],dp[i-1][3])
            ## 到卖出状态:只有冷冻期过后买,或者保持之前的卖出状态
            dp[i][2] = dp[i-1][0]+prices[i]
            ## 达到今天就卖出;不考虑和前面的比较
            dp[i][3] = dp[i-1][2]
            ## 一卖出就进入冷冻期 不考虑其他可能;
        return max(dp[-1])

714.买卖股票的最佳时机含手续费

题解思路

  • 只是在买卖的基础上增加了手续费;

题解代码

股票问题总结:

  • 题目分类
    image
  • 分为:
    • 买卖次数一次和多次:只有买卖状态
    • 最多买k次:因为相互有连续,所以有 \(2*k+1\) 个状态
    • 冷冻期:因为有冷冻期,所以有买 卖 卖动作 冷冻期 4个状态
    • 手续费:只在多次的基础上,增加了一个计算
点击查看代码
class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        dp = [[0]*2 for _ in range(len(prices))]
        dp[0][1] = -prices[0]

        for i in range(1,len(prices)):
            dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]-fee)
            dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i])

        return dp[-1][0] 
posted @ 2024-07-26 10:54  哆啦**  阅读(1)  评论(0编辑  收藏  举报