用四个变量
b
u
y
1
,
s
e
l
l
1
,
b
u
y
2
,
s
e
l
l
2
buy1, sell1, buy2, sell2
buy1,sell1,buy2,sell2分别代表交易进行到剩下的四种状态时,当前获利的最大值。(这里变量名尽量与官方题解保持一致)
接下来我们严格遵守上述四个变量的含义
将四个变量的初始值赋值为第一天过后的最大获利值:
b
u
y
1
buy1
buy1:第一天进行了一次买入。那么当前最大获利为
负的第一天的股价
负的第一天的股价
负的第一天的股价(说是最大获利,其实第一天进行到这种状态的话别无选择,只有这一种获利结果)
s
e
l
l
1
sell1
sell1:第一天进行了一次买卖。那么买入和卖出的价格相同,当前最大获利为
0
0
0
b
u
y
2
buy2
buy2:第一天进行了一次买卖 + 一次买入。也就是说第一天买了一次立刻卖了,然后又买了一次,总(最大)获利为
负的第一天的股价
负的第一天的股价
负的第一天的股价
s
e
l
l
2
sell2
sell2:第一天进行了两次买卖。总收益为
0
0
0
int buy1 =-prices[0]int sell1 =0;int buy2 =-prices[0]int sell2 =0;
1
2
3
4
接下来,从第
2
2
2天开始,模拟前
i
i
i天,每种状态下的最大获利。
b
u
y
1
buy1
buy1:前
i
i
i天只进行过一次买入的最大获利。
b
u
y
=
max
(
b
u
y
′
,
−
p
r
i
c
e
s
[
i
]
)
buy=\max(buy', -prices[i])
buy=max(buy′,−prices[i])。也就是说,可以是前
i
−
1
i-1
i−1天股价较低的时候进行一次买入(
b
u
y
′
buy'
buy′),也可以不在前
i
−
1
i-1
i−1天买而是在第
i
i
i天买入(
−
p
r
i
c
e
s
[
i
]
-prices[i]
−prices[i])。(这里用
b
u
y
′
buy'
buy′代表第
i
−
1
i-1
i−1天时
b
u
y
buy
buy的值)
s
e
l
l
1
sell1
sell1:前
i
i
i天进行过一次买卖。
s
e
l
l
1
=
max
(
s
e
l
l
1
′
,
b
u
y
1
′
+
p
r
i
c
e
s
[
i
]
)
sell1=\max(sell1', buy1' + prices[i])
sell1=max(sell1′,buy1′+prices[i])。也就是说,可以是在前
i
−
1
i-1
i−1天进行了一次买卖而今天不进行任何操作(
s
e
l
l
1
′
sell1'
sell1′),也可以是前
i
−
1
i-1
i−1天只进行了买入而在第
i
i
i天卖出(
b
u
y
1
′
+
p
r
i
c
e
s
[
i
]
buy1'+prices[i]
buy1′+prices[i])(卖出会获利
p
r
i
c
e
s
[
i
]
prices[i]
prices[i])
b
u
y
2
buy2
buy2:前
i
i
i天进行过一次买卖+一次买入。
b
u
y
2
=
max
(
b
u
y
2
′
,
s
e
l
l
1
′
−
p
r
i
c
e
s
[
i
]
)
buy2=\max(buy2', sell1'-prices[i])
buy2=max(buy2′,sell1′−prices[i])。也就是说,可以是在前
i
−
1
i-1
i−1天进行了一次买卖+一次买入而今天不进行任何操作(
b
u
y
2
′
buy2'
buy2′),也可以是前
i
−
1
i-1
i−1天进行了一次买卖而在第
i
i
i天又买入了一次(
s
e
l
l
1
′
+
(
−
p
r
i
c
e
s
[
i
]
)
sell1' + (-prices[i])
sell1′+(−prices[i]))(买入会支出
p
r
i
c
e
s
[
i
]
prices[i]
prices[i])
s
e
l
l
2
sell2
sell2:前
i
i
i天进行了两次买卖。
s
e
l
l
2
=
max
(
s
e
l
l
2
′
,
b
u
y
2
′
+
p
r
i
c
e
s
[
i
]
)
sell2=\max(sell2',buy2'+prices[i])
sell2=max(sell2′,buy2′+prices[i])。可以是在前
i
−
1
i-1
i−1天进行了两次买卖而今天不进行任何操作(
s
e
l
l
2
′
sell2'
sell2′),也可以是前
i
−
1
i-1
i−1天只进行了一次买卖+一次买入而在第
i
i
i天卖出了第二次买入(
b
u
y
2
′
+
p
r
i
c
e
s
[
i
]
buy2'+prices[i]
buy2′+prices[i])(卖出会获利
p
r
i
c
e
s
[
i
]
prices[i]
prices[i])
因此,模拟完
n
n
n天后,返回
s
e
l
l
2
sell2
sell2即可(进行了两次买卖)