题目
题目链接
给定一个数组,表示股票每天的价格,最多可以进行2次买+卖的操作,求能获得的最大利润
思路
动态规划
设置dst
i
j
:
i
表示当前为第几笔交易,可以为1、2
j
表示当前是否持有股票,1为持有,0为不持有
共有4种情况:
dst11
:11表示当前为第一笔交易,且当前持有股票;
指在今天或者之前买入了第一只股票,初始值设为-prices[0]
(在第一天买入)
dst11=max(dst11,-prices[i])
dst10
:10表示当前为第一笔交易,且当前不持有股票;
指今天卖出了第一只股票,初始值设为0(不亏不赚)
dst10
的状态可由dst11
转来(卖出第一只股票)
dst10 = max(dst10, dst11 + prices[i])
dst21
:21表示当前为第二笔交易,且当前持有股票;
指在今天或者之前买入了第二只股票,初始值设为-prices[0]
(在第一天买入)
dst21
的状态可由dst10
转来(卖出第一只股票后,才能买入第二只股票)
dst21 = max(dst21, dst10 - prices[i])
dst20
:20表示当前为第二笔交易,且当前不持有股票;
指今天卖出了第二只股票,初始值设为0(不亏不赚)
dst20
的状态可由dst21
转来(卖出第二只股票)
dst20 = max(dst20, dst21 + prices[i])
代码
class Solution:
def maxProfit(self, prices):
# 两位数字分别表示:第几笔交易(1、2),是否持有股票(1持有,0不持有)
dst10, dst11, dst20, dst21 = 0, -prices[0], 0, -prices[0]
for i in range(len(prices)):
# 11表示当前为第一笔交易,且当前持有股票,指今天或者之前买入第一只股票
dst11 = max(dst11, -prices[i])
# 10表示当前为第一笔交易,且当前不持有股票,指今天卖出
dst10 = max(dst10, dst11 + prices[i])
# 21表示当前为第二笔交易,且当前持有股票,指今天或之前买入第二只股票
dst21 = max(dst21, dst10 - prices[i])
# 20表示当前为第二笔交易,且当前不持有股票,指今天卖出
dst20 = max(dst20, dst21 + prices[i])
return dst20
参考链接
https://www.jianshu.com/p/3a0dddae3726
https://blog.csdn.net/ggdhs/article/details/92618827