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/