解法一: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]