leetcode刷题-动态规划09

代码随想录动态规划part09|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、 714.买卖股票的最佳时机含手续费、股票总结

    • 188.买卖股票的最佳时机IV
    • 309.最佳买卖股票时机含冷冻期
    • 714.买卖股票的最佳时机含手续费
    • 股票总结

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

leetcode题目链接
代码随想录文档讲解

思路

123题最多可以买卖两次(dp数组的维度为[len(prices),5]),本题可以买卖k次(dp数组的维度为[len(prices),2k+1])

  1. dp数组定义

  2. 递推公式
    dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
    dp[i][2] = max(dp[i-1][2], dp[i-1][1]+prices[i])

  3. 初始化

  4. 遍历顺序

python代码

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

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

leetcode题目链接
代码随想录文档讲解

思路

本题相比122买卖股票2(可以买卖无限次)添加冷冻期

  1. dp数组定义
    dp[i][0] 持有股票状态
    dp[i][1] 保持卖出股票状态
    dp[i][2] 卖出股票
    dp[i][3] 冷冻期
  2. 递推公式
    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][1], dp[i-1][3])
    保持卖出股票状态 = 前一天保持卖出股票,前一天冷冻期
    dp[i][2] = dp[i-1][0]+prices[i]
    卖出股票 = 持有股票卖出
    dp[i][3] =dp[i-1][2]
    冷冻期 = 前一天卖出股票
  3. 初始化
    dp[0][0] = -prices[0]
    dp[0][1] = 0 (dp[1][0] = dp[0][1] - prices[i],所以应该初始化为0)
    dp[0][2] = 0 (dp[1][3] =dp[0][2])
    dp[0][3] = 0
  4. 遍历顺序

python代码

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])
            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[len(prices)-1][1], dp[len(prices)-1][2], dp[len(prices)-1][3])

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

leetcode题目链接
代码随想录文档讲解

思路

本题相比122买卖股票2(可以买卖无限次)添加手续费

  1. dp数组定义
    dp[i][0]
    dp[i][1]
  2. 递推公式
    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)
  3. 初始化
    初始化同122题一样,注意dp[0][1] = 0 而不是 -fee
  4. 遍历顺序

python代码

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] = -fee
        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 max(dp[len(prices)-1][0], dp[len(prices)-1][1])  

股票总结

文档总结

你可能感兴趣的:(leetcode,动态规划,算法)