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

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

题目描述: 188.买卖股票的最佳时机IV.

解法

dp

class Solution(object):
    def maxProfit(self, k, prices):
        dp = [[0] * (2*k+1) for _ in range(len(prices))]
        # 0表示没有,j奇数表示买了j//2+1次,j为偶数表示卖了j//2次
        for j in range(1,2*k+1,2):
            dp[0][j] = -prices[0]
        for i in range(1,len(prices)):
            for j in range(1,2*k+1):
                if j % 2 == 1:
                    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[len(prices)-1][2*k]

思路其实和上一题是一样的,奇数和偶数状态都有规律。

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

题目描述: 309.最佳买卖股票时机含冷冻期.

解法

dp

class Solution(object):
    def maxProfit(self, prices):
        # 有还是没有
        # 有:0之前就有,今天才有
        # 没有:1可购买期,2今天卖了,3冷冻期
        dp = [[0]*5 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][1]-prices[i],dp[i-1][3]-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.买卖股票的最佳时机含手续费

题目描述: 714.买卖股票的最佳时机含手续费.

解法

dp

class Solution(object):
    def maxProfit(self, prices, fee):
        #0没股票,1有股票
        dp = [[0] * 2 for _ in range(len(prices))]
        dp[0][1] = 0-prices[0]-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 dp[len(prices)-1][0]

没什么难度

你可能感兴趣的:(算法)