给你一个整数数组 prices
和一个整数 k
,其中 prices[i]
是某支给定的股票在第 i
天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k
笔交易。也就是说,你最多可以买 k
次,卖 k
次。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入:k = 2, prices = [2,4,1] 输出:2 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。
示例 2:
输入:k = 2, prices = [3,2,6,5,0,3] 输出:7 解释:在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。 随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
这道题是123那道题的抽象化,那道题是2次买卖股票,这道题抽象成k次买卖,若k=2,那不就是那道题了嘛。
因此核心思路完全一模一样。2次买卖我们设了4个状态分别表示第一次买入/卖出和第二次买入/卖出,那么这里k次买卖我们就相应的设2k个状态分别表示每次的买入和卖出。
然后递推公式,前两次的状态我们分析的很透彻了,第三次也一样,第四次......第k次也一模一样呀,只不过我们不能像上一道题一样每个状态列出来,我们得用个循环,把状态写进去。
然后是初始化了,也没什么区别,我们要初始化dp[0][0~2k-1],首先第0天不管第几次买入,都是-prices[0],因为一开始还没卖出股票,压根没利润,初始金额为0;然后第0天不管第几次卖出,那就是相当于第0天买入又卖出,进行了k次,那不是一分钱没花一分钱没赚嘛,为0
指路123那道题的题解:123. 买卖股票的最佳时机 III-CSDN博客
代码(Python):
class Solution(object):
def maxProfit(self, k, prices):
dp = [[0]*(2*k) for _ in range(len(prices)+1)]
for i in range(2*k): #初始化,第0天不管第几次买入都是-prices[0],卖出都是0
if i % 2 == 0:
dp[0][i] = -prices[0]
else:
dp[0][i] = 0
for i in range(1,len(prices)):
for j in range(2*k):
if j % 2 == 0: #买入
if j == 0: #第一次买入
dp[i][j] = max(dp[i-1][j],-prices[i])
else: #后面几次买入
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]-prices[i])
else: #卖出
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]+prices[i])
return dp[len(prices)-1][2*k-1]