代码随想录算法训练营第四十二天|leetcode188.买卖股票的最佳时机IV、leetcode309.最佳买卖股票时机含冷冻期、leetcode 714.买卖股票的最佳时机含手续费

1 leetcode188.买卖股票的最佳时机IV

题目链接:188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

文章链接:代码随想录

视频链接:动态规划来决定最佳时机,至多可以买卖K次!| LeetCode:188.买卖股票最佳时机4_哔哩哔哩_bilibili

思路:其实跟三很像,将那个进行一个循环就好了

1.1 自己的方法

就是容易把那个后面的数字给写超出范围,其他的就还行

class Solution:
    def maxProfit(self, k: int, prices: List[int]) -> int:
        dp = [[0]*(2*k+1) for _ in range(len(prices))]
        for i in range(1,len(dp[0]),2):
            dp[0][i] = -prices[0]
        for j in range(1,len(prices)):
            for m in range(0,2*k-1,2):
                dp[j][m+1] = max(dp[j-1][m+1],dp[j-1][m]-prices[j])
                dp[j][m+2] = max(dp[j-1][m+2],dp[j-1][m+1]+prices[j])
        return dp[len(prices)-1][2*k]

1.2 本题小结

  1. 买卖股票的题目,重点就是定义dp上面,dp的含义就包含是买股票还是不买股票,两种状态
  2. 第二个就是递推公式的书写,这里也是很有技巧的地方,容易写错吧,其实还是,就像最后一题,我写着也会超出时间的限制,还是多练习吧,总之

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

题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili

思路:确实加了冷冻期以后我就不知道怎么往后面写了,有一说一,还是多看多积累吧

2.1 视频后的思路

怎么说呢,感觉挺清晰的,但是也没那么清晰吧,也有一点迷糊在里面的,但是我也能理解一些

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        dp = [[0]*4 for _ in range(len(prices))]
        dp[0][0] =-prices[0]
        dp[0][1] = 0
        dp[0][2] = 0
        dp[0][3] = 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])
            dp[i][1] = max(dp[i-1][3],dp[i-1][1])
            dp[i][2] = dp[i-1][0]+prices[i]
            dp[i][3] = dp[i-1][2]
        return max(dp[len(prices)-1][1],dp[len(prices)-1][2],dp[len(prices)-1][3])

2.2 本题小结

  1. 这个题目,怎么说呢,就是状态的确定吧,但是几个状态之间的耦合性真的太强了,导致我其实也有一些不理解的地方吧,接下来后续还是多看看吧
  2. 冻结期的这一块,其实还是有点模糊的吧,希望后面能慢慢看懂,为什么,自己能理解吧

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

题目链接:714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:动态规划来决定最佳时机,这次含手续费!| LeetCode:714.买卖股票的最佳时机含手续费_哔哩哔哩_bilibili

3.1 本题的方法

感觉这道题,思路非常明显,直接在后面进行一个减去费用的操作就行了

class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        dp = [[0]*2 for _ in range(len(prices))]
        dp[0][0] = -prices[0]
        dp[0][1] = 0
        for i in range(1,len(prices)):
            dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i])
            dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]-fee)
        return dp[-1][-1]

3.2 本题小结

  1. 跟之前的方法真的一模一样,就是有一个卖了股票以后需要减去手续费即可,其他的操作依然相同
  2. 真的逐渐掌握啦

4 今日小结

  1. 这些题目,股票类问题,说白了就是围绕着这个递推公式,逐步在里面变着花样玩,但是呢,里面的本质逻辑没什么变化
  2. 终于又掌握了一种题型,希望自己继续加油咯
posted @ 2024-12-09 10:48  小方呀0524  阅读(45)  评论(0)    收藏  举报