状态机动态规划 State Machine DP
思路

122. 买卖股票的最佳时机 II / Best Time to Buy and Sell Stock II
简要题意: prices[i] 为第 i 天股价。可完成多次买入卖出,但任意时刻最多持有一股。可在同一天先卖再买。返回最大总利润,不交易时利润为 0。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
f0 = 0
f1 = -inf
for i, p in enumerate(prices):
new_f0 = max(f0, f1 + p)
f1 = max(f1, f0 - p)
f0 = new_f0
return f0
123. 买卖股票的最佳时机 III / Best Time to Buy and Sell Stock III:最多完成两笔交易
简要题意: 给定每日股价,最多完成两次买入和卖出,同一时间只能持有一股,求最大利润。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp=[[[0,0] for i in range(3)] for j in range(len(prices))]
dp[0][1][0]=dp[0][2][0]=0
dp[0][1][1]=dp[0][2][1]=-prices[0]
for i in range(1,len(prices)):
for j in range(1, 3):
dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j][1] + prices[i])
dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j-1][0] - prices[i])
return dp[len(prices)-1][2][0]
188. 买卖股票的最佳时机 IV / Best Time to Buy and Sell Stock IV:最多完成 k 笔交易
简要题意: 给定每日股价和交易上限 k,最多完成 k 次交易,同一时间只能持有一股,求最大利润。
Input: k = 2, prices = [3,2,6,5,0,3]
Output: 7
Explanation: Buy on day 2 (price = 2) and sell on day 3 (price = 6), profit = 6-2 = 4. Then buy on day 5 (price = 0) and sell on day 6 (price = 3), profit = 3-0 = 3.
递归要点
- 持有时
hold == 1,卖出dfs(i, j, 0) = max(dfs(i-1, j, 0), dfs(i-1, j - 1, 1) + prices[i]) - 不持有时
hold == 0, 买入dfs(i, j, 1) = max(dfs(i-1, j, 1), dfs(i-1, j, 0) - prices[i]) - 买入或卖出算作一次交易。代码中的
j-1可以是在买股票的时候,也可以是在卖股票的时候
