Bootstrap

代码随想录算法训练营第四十六天| 动态规划09

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

代码随想录

这是昨天最佳时机III的进阶,昨天最多卖2次,有五个状态,这回最多卖k次,有2k+1个状态,参照昨天的方式即可,注意考虑状态之间的联系

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

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

代码随想录

四个状态:

当前持有股票的最大利润等于前一天持有股票的最大利润或者前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格

当前不持有股票且处于冷冻期的最大利润等于前一天持有股票的最大利润加上当前股票的价格

当前不持有股票且不处于冷冻期的最大利润等于前一天不持有股票的最大利润或者前一天处于冷冻期的最大利润

当前不持有股票且当天卖出后处于冷冻期的最大利润等于前一天不持有股票且不处于冷冻期的最大利润

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

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

代码随想录

dp[i][0]表示第i天持有股票的最大收益,可以是前一天就已经持有,也可以是当天买进

dp[i][1]表示第i天没有股票的最大收益,可以是前一天就没有,也可以是当天卖出,记得添加手续费

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

;