模版题-动态规划-买卖股票的最佳时机III ( 多状态 )
```python
class Solution:
# 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
# 设计一个算法来计算你所能获取的最大利润。最多可以完成两笔交易。
# 注意:不能同时参与多笔交易(必须在再次购买前出售掉之前的股票)。
def maxProfit(self, prices: List[int]) -> int:
# 状态:
# 0: 第1次没有股票
# 1: 第1次持有股票
# 2: 第2次没有股票
# 3: 第2次持有股票
# dp[ i ][ x ]表示第i天状态为x的最大利润
n = len( prices )
dp = [ [ 0, 0, 0, 0 ] for _ in range( n ) ]
dp[ 0 ][ 0 ] = 0
dp[ 0 ][ 1 ] = -prices[ 0 ]
dp[ 0 ][ 2 ] = 0
dp[ 0 ][ 3 ] = -prices[ 0 ] # 可以理解为 买入->卖出->又买入
for i in range( 1, n ):
# 第1次没有股票: 原先是第1次没有股票 or 第1次持有后卖出
dp[ i ][ 0 ] = max( dp[ i - 1 ][ 0 ], dp[ i - 1 ][ 1 ] + prices[ i ] )
# 第1次持有股票: 原先是第1次持有股票 or 第1次买入
dp[ i ][ 1 ] = max( dp[ i - 1 ][ 1 ], - prices[ i ] )
# 第2次没有股票: 原先是第2次没有股票 or 第2次持有后卖出
dp[ i ][ 2 ] = max( dp[ i - 1 ][ 2 ], dp[ i - 1 ][ 3 ] + prices[ i ] )
# 第2次持有股票: 原先是第2次持有股票 or 第1次没有股票后买入
dp[ i ][ 3 ] = max( dp[ i - 1 ][ 3 ], dp[ i - 1 ][ 0 ] - prices[ i ] )
return dp[ n - 1 ][ 2 ]
```