539 字
3 分钟
代码随想录算法训练营第三十五天 | 动态规划 Part08

121. 买卖股票的最佳时机(一)#

LeetCode 121. Best Time to Buy and Sell Stock 通用状态定义:

  • dp[i][0]: 第 i 天 不持有 股票的最大利润
  • dp[i][1]: 第 i 天 持有 股票的最大利润

状态转移:

  • dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
  • dp[i][1] = max(dp[i-1][1], -prices[i])(只能买一次,所以只能是 -prices[i]
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
dp = [[0] * 2 for _ in range(n)]
for i in range(n):
if i - 1 == -1:
# base case
dp[i][0] = 0 # 第一天没有持有股票,利润为 0
dp[i][1] = -prices[i] # 第一天买入股票,花费 prices[i]
continue
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]) # 昨天没持有 vs 昨天持有今天卖出
dp[i][1] = max(dp[i - 1][1], -prices[i]) # 昨天持有 vs 今天重新买入(只能买一次)
return dp[n - 1][0]

122. 买卖股票的最佳时机(二)#

LeetCode 122. Best Time to Buy and Sell Stock II

class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
dp = [[0] * 2 for _ in range(n)]
for i in range(n):
if i - 1 == -1:
# base case
dp[i][0] = 0 # 第一天不持有股票,利润为 0
dp[i][1] = -prices[i] # 第一天持有股票(买入)
continue
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]) # 昨天不持有 vs 昨天持有今天卖出
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]) # 昨天持有 vs 今天买入(可以多次交易)
return dp[n - 1][0]

123. 买卖股票的最佳时机(三)#

LeetCode 123. Best Time to Buy and Sell Stock III

三维动态规划定义:

  • dp[i][k][0]: 第 i 天,最多交易 k 次,不持有股票的最大利润
  • dp[i][k][1]: 第 i 天,最多交易 k 次,持有股票的最大利润

状态转移方程:

  • dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
  • dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_k = 2 # 最多两次交易
n = len(prices)
dp = [[[0 for _ in range(2)] for _ in range(max_k + 1)] for _ in range(n)]
for i in range(n):
for k in range(max_k, 0, -1):
if i - 1 == -1:
# base case
dp[i][k][0] = 0 # 第一天不持股
dp[i][k][1] = -prices[i] # 第一天持股
continue
dp[i][k][0] = max(dp[i - 1][k][0], dp[i - 1][k][1] + prices[i]) # 不持股 or 今天卖出
dp[i][k][1] = max(dp[i - 1][k][1], dp[i - 1][k - 1][0] - prices[i]) # 持股 or 今天买入(消耗一次交易)
return dp[n - 1][max_k][0]
代码随想录算法训练营第三十五天 | 动态规划 Part08
https://fuwari.vercel.app/posts/code_musings_day_thirty-five/
作者
Jarrett
发布于
2025-07-21
许可协议
CC BY-NC-SA 4.0