这道题可以说是比较难了,我想了好长时间,写出的算法也不算特别理想。
就大致说一下吧。
class Solution(object):
def maxProfit(self, prices):
if not prices:
return 0
n = len(prices)
dp = [[0] * n for _ in range(3)]
for k in range(1, 3):
pre_max = -prices[0]
for i in range(1, n):
pre_max = max(pre_max, dp[k - 1][i - 1] - prices[i])
dp[k][i] = max(dp[k][i - 1], prices[i] + pre_max)
return dp[-1][-1]
思路是:限制卖出次数小于等于k次 第n天第k次卖出时的最大利润:
1、前一天已经卖出k次:DP[k][n-1],所以只有一种情况,无法再买入和卖出;
2、前一天已经卖出k-1次,DP[k-1][n] + 卖出第n天的股票后的利润;
边界条件: 如果第n-1天第k-1卖出后再买入的利润仍然比前一天还高,则买入,否则就不买,
也就是说增加买入次数更划算的时候,增加买入次数,否则维持买入次数不变;
pre_max = max(pre_max, dp[k - 1][n - 1] - prices[n])