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

Leetcode - 309

这题主要是要想清楚,这个冷冻期如何穿插在持有股票拍和不持有股票之间。

首先是不持有股票,然后持有股票,再卖出,卖出的第二天就是冷冻期,然后是不持有。

所以说冷冻期只能由前一天卖出态得到。

一一细分,持有态,可以由前一天的持有态得到,也可以由前一天的未持有然后今天构入得到,也可以是前一天是冷冻期,今天刚购入得到,一共三种情况,取max。

冷冻期,有且仅由前一天卖出得到,也就是前一天是未持有态,但是如果取所有的未持有状态作为递推,那就混淆了,所以我们要将未持有态分为,当天卖出和冷冻态之后两种。冷冻态仅仅能由前一种递推得到。

未持有:1. 当天卖出,可由前一天持有得到

2. 冷动态后,冷动态作为前一天和前一天本来就是未持有态,两种情况

def maxProfit(self, prices: List[int]) -> int:
        dp = [[0,0,0,0] for _ in range(len(prices))]

        dp[0][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],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[-1])

Leetcode - 714

这题就是在每个交易中减去一个费用,每次交易所得真实利润为原利润减去费用,所以这里的费用是减在卖出股票这一步的,也就是未持有股票的其中一个状态

def maxProfit(self, prices: List[int], fee: int) -> int:
        dp = [[0,0] for _ in range(len(prices))]

        dp[0][1] = -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]

你可能感兴趣的:(leetcode,算法,职场和发展)