动态规划
class Solution:
def maxProfit(self, k, prices):
size = len(prices)
maxv = 0
dp = [[[0] * (k + 1) for _ in range(2)] for _ in range(size)]
dp[0][0][0] = 0
dp[0][1][0] = -prices[0]
for i in range(1, k + 1):
dp[0][0][i] = dp[0][1][i] = -float('inf')
for i in range(1, size):
for j in range(k + 1):
if j != 0:
dp[i][0][j] = max(dp[i - 1][0][j], dp[i - 1][1][j - 1] + prices[i])
dp[i][1][j] = max(dp[i - 1][1][j], dp[i - 1][0][j] - prices[i])
maxv = max(maxv, dp[i][0][j])
return maxv
定义状态dp[i][j][k]表示在当前状态下能够得到的最大盈利
(i:第i天,j:当前是否持股(1是0否),k:当前已经卖出过几次股票)
--构建三维dp数组,初始化为0
--dp[0][1][0] = -prices[0](第0天持有股票已卖出0次的总盈利,即买第一天的股票花费price[0])
--dp[0][0][i], dp[0[[1][i](i>1) = -float('inf')(第0天只能卖出0次,其他状态都不可能)
--从1到size-1遍历i
--从0到k遍历j
--情况1:第i-1天持有股票,在第i天卖出,+第i天股票价格,此时卖出次数+1
dp[i][0][j] 为 dp[i - 1][1][j - 1] + prices[i] 和 前一天相同状态 的较大值
(注意此情况卖出次数至少为1 ,所以加入判断去除卖出后卖出次数还为0的情况)
--情况2:第i-1天未持有股票,在第i天买入,-第i-1天股票价格,此时卖出次数不变
dp[i][1][j] 为 dp[i - 1][0][j] - prices[i] 和 前一天相同状态 的较大值
--记录当前轮次中不持有股票时能够盈利的最大值