leetcode 714 股票dp

解法一:dp

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)

问题的核心是上述状态转移公式,第一条是好理解的,要吗保留,要么卖掉挣钱。第二条稍微难点,因为明显,买股票要花钱,为什么一定比持有股票便宜呢。这是因为,此处是0代表前几步肯定卖出去了。而这中间的差价是大于0的,能用这个差价赚钱,就可以更新了。完整代码如下:

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

解法二:优化dp
一个很常见的地方,就是我们可以发现,每次只用到上一位置的元素,所以O(1)空间复杂度即可完成,代码如下:

class Solution:
    def maxProfit(self, prices: List[int], fee: int) -> int:
        dp = [0, -prices[0]-fee]

        for i in range(1, len(prices)):
            dp[0] = max(dp[0], dp[1]+prices[i])
            dp[1] = max(dp[1], dp[0]-prices[i]-fee)

        return dp[0]
上一篇:34岁Android程序员裸辞,714页PDF的鸿蒙学习笔记


下一篇:绘制三维心