123.买卖股票的最佳时机III
解题思路:划分为4个状态,用动规联系起来
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
dp = [[0]*5 for _ in range(n)]
#初始化
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,n):
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
解题思路:划分为2个状态,用动规联系起来
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
#就是将123这题的最多2次买卖变成了k次(一次交易就会产出两个状态)
#dp[i][j]: j是奇数的话,是持有股票状态
# j是偶数的话,是不持有股票状态
#初始化
dp = [[0] * (2*k+1) for _ in range(len(prices))]
for a in range(1,2*k,2):
dp[0][a] = -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][-1]