买卖股票,只能交易K次
不限制交易次数的时候,每一次买入的状态都可以看做是相同的,都是dp[i][0],但是有交易限制的时候,每一次买入的状态都是不同的:dp[i][j] 定义为j为奇数的时候代表持有的状态,j为偶数代表不持有的状态
k次交易,一共有k个买的状态和k个卖的状态,一共2k个状态
def maxProfit(self, k, prices):
"""
:type k: int
:type prices: List[int]
:rtype: int
"""
# dp[i][j] j为奇数的时候代表持有的状态,j为偶数代表不持有的状态
# k次交易,一共有k个买的状态和k个卖的状态
if len(prices)<=1:
return 0
else:
dp=[[0]*(2*k+1) for _ in range(len(prices))]
dp[0][0]=0
for j in range(1,2*k+1,2):
dp[0][j]=-prices[0]
for i in range(1,len(prices)):
for j in range(1,2*k+1,2):
dp[i][j]=max(dp[i-1][j-1]-prices[i],dp[i-1][j])
dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]+prices[i])
return dp[i][2*k]
买卖股票的最佳时机III(只能交易两次![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/23ad43cb7c3a4382bc33516fec2d3018.png)
交易两次,把K设置为2即可
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
k=2
# dp[i][j] j为奇数的时候代表持有的状态,j为偶数代表不持有的状态
# k次交易,一共有k个买的状态和k个卖的状态,一共2k个状态
if len(prices)<=1:
return 0
else:
dp=[[0]*(2*k+1) for _ in range(len(prices))]
dp[0][0]=0
for j in range(1,2*k+1,2):
dp[0][j]=-prices[0]
for i in range(1,len(prices)):
for j in range(1,2*k+1,2):
dp[i][j]=max(dp[i-1][j-1]-prices[i],dp[i-1][j])
dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]+prices[i])
return dp[i][2*k]