和之前是一样的,就是变成了0次1次买不买2次买不买5种状态
因为都是和前一天比,还可以只用一行反复更新省空间
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices: return 0
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][4]
可以看到正反规律,推广到函数版本
class Solution:
def maxProfit(self, k: int, prices: List[int]) -> int:
if not prices: return 0
dp=[[0]*(2*k+1) for _ in range(len(prices))]
for j in range(1,2*k,2):
dp[0][j]=-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]