说明
较难,二刷再仔细打代码
123.买卖股票的最佳时机III 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖
class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) == 0:return 0dp = [[0] * 5 for _ in range(len(prices))]dp[0][1] = -prices[0]dp[0][3] = -prices[0]for i in range(1, len(prices)):dp[i][0] = dp[i-1][0]dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])dp[i][2] = max(dp[i-1][2], dp[i-1][1] + prices[i])dp[i][3] = max(dp[i-1][3], dp[i-1][2] - prices[i])dp[i][4] = max(dp[i-1][4], dp[i-1][3] + prices[i])return dp[-1][4]
188.买卖股票的最佳时机IV 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
提醒
本题是123.买卖股票的最佳时机III 的进阶版
class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if len(prices) == 0:return 0dp = [[0] * (2*k+1) for _ in range(len(prices))]for j in range(1, 2*k, 2):dp[0][j] = -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]