Leetcode 188. 买卖股票的最佳时机 IV
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
Code
def maxProfit(self, K: int, prices: List[int]) -> int:
if prices is None or len(prices)==0:
return 0
n=len(prices)
dp=[[0]*((2*K+1)+1) for _ in range(n+1)]
if K>n//2:
result=0
for i in range(0,n-1,1):
if prices[i+1] > prices[i]:
result += (prices[i+1]-prices[i])
return result
dp[0][1]=0
for k in range(2,((2*K+1)+1),1):
dp[0][k]=float('-inf')
for i in range(1,n+1,1):
for j in range(1,((2*K+1)+1),2):#1,3,5
dp[i][j]=dp[i-1][j]#昨天没有持有今天还没有
if j>1 and i>1 and dp[i-1][j-1] != float('-inf'):#昨天持有但今天卖出
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+prices[i-1]-prices[i-2])
for j in range(2,((2*K+1)+1),2):#2,4
dp[i][j]=dp[i-1][j-1]#昨天未持有今天买入
if i>1 and dp[i-1][j] != float('-inf'):#昨天持有并且今天依然持有
dp[i][j]=max(dp[i][j],dp[i-1][j]+prices[i-1]-prices[i-2])
if j>2 and i>1 and dp[i-1][j-2] != float('-inf'):#昨天持有今天卖出并买入
dp[i][j]=max(dp[i][j],dp[i-1][j-2]+prices[i-1]-prices[i-2])
res=float('-inf')
for i in range(1,((2*K+1)+1),2):
res=max(res,dp[n][i])
return res
想法
1.dp[i][j]为前i天(第i-1天)结束后,处于阶段j,最大获利。
2.K交易次数,之所以K>n/2是由于,如果超过n/2的话,那么交易天数就有些会连起来。
3.在https://blog.csdn.net/vvv__vvv/article/details/110096694
中要求dp[i][1]dp[i][3]dp[i][5]
这里由于交易K次,所以要选择1,3,5,2K+1