1、买卖股票
class Solution: # 动规
def maxProfit(self, prices: List[int]) -> int:
# dp[i][0]不持股最大利润
# dp[i][1]持股最大利润
dp = [[0]*2 for _ in range(len(prices))]
dp[0][0] = 0
dp[0][1] = -prices[0] # 第一天就买入
for i in range(1, len(prices)):
# 就是说第i天他肯定要持有这个股票,想要持有那就只能是第i-1天就买入了(这时候对第i天没改变)或者第i天买入,那就是现在的钱减掉了price[i]
dp[i][1] = max(dp[i-1][1], -prices[i])
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
return dp[-1][0]
2、买卖股票II
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [[0]*2 for i in range(len(prices))]
dp[0][1] = -prices[0]
for i in range(1, len(prices)):
# 区别在于此,可以多次买卖,因此dp[i][1]需要由dp[i-1][0]参与更新
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])
return dp[-1][0]
3、买卖股票III
class Solution:
def maxProfit(self, prices: List[int]) -> int:
# 定义5种状态:0:未操作;1:第一次买入;2:第一次卖出;3:第二次买入;4:第二次卖出
# 买卖n次就定义n+1种状态,每种状态由上一种状态更新而来
dp = [[0]*5 for _ in range(len(prices))]
dp[0][0] = 0
dp[0][1] = -prices[0]
dp[0][2] = 0
dp[0][3] = -prices[0]
dp[0][4] = 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][-1]