应用题-动态规划-买卖股票的最佳时机含冷冻期
**分清状态,以及状态转移的方式。**
```python
class Solution:
# 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
# 设计一个算法计算出最大利润。在满足以下约束条件下,可以尽可能地完成更多的交易(多次买卖一支股票):
# - 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
# 注意:不能同时参与多笔交易(必须在再次购买前出售掉之前的股票)。
def maxProfit(self, prices: List[int]) -> int:
n = len( prices )
if n == 0 or n == 1: return 0
# 每天的状态: 非冷冻期不持有股票、冷冻期不持有股票、持有股票
# dp[ i ][ j ] 第i天时,状态j
# (0非冷冻期不持有股票 1冷冻期不持有股票 2持有股票) 的最大利润
dp = [ [ 0, 0 , 0 ] for _ in range( n ) ]
dp[ 0 ][ 2 ] = -prices[ 0 ]
"""
时间 发生的事情 状态
第 i-1 天开盘 持有股票 —
第 i-1 天盘中 卖出 —
第 i-1 天收盘 进入冷冻期 dp[i-1][1]
第 i 天全天 禁止任何交易 冷冻期仍在持续
第 i 天收盘 冷冻期结束 不持有股票且不处于冷冻期
┌───────────────────────────────────────┐
▼ │
┌─────────┐ 卖出(当天) ┌─────────┐ │
持有 ─────────────► 冷冻期 │
└─────────┘ └─────────┘ │
▲ │ │
│ │ 过一天 │
│ 买入 │ 冷冻解除 │
│ ▼ │
│ 从无冷冻买入 ┌────────┐ │
└──────────────────────│ 无冷冻 │───────┘
└────────┘
"""
for i in range( 1, n ):
# 不持有股票且不处于冷冻期的最大利润等于 ->
# 前一天不持有股票的最大利润、前一天处于冷冻期的最大利润( 前一天卖出今天就是冷冻期 )
dp[ i ][ 0 ] = max( dp[ i - 1 ][ 0 ], dp[ i - 1 ][ 1 ] )
# 不持有股票且处于冷冻期的最大利润等于 ->
# 前一天持有股票的最大利润加上当前股票的价格( 前一天卖出今天就是冷冻期 )
dp[ i ][ 1 ] = dp[ i - 1 ][ 2 ] + prices[ i ]
# 持有股票的最大利润等于 ->
# 前一天持有股票的最大利润、前一天不持有股票且不处于冷冻期的最大利润减去当前股票的价格
dp[ i ][ 2 ] = max( dp[ i - 1 ][ 2 ], dp[ i - 1 ][ 0 ] - prices[ i ] )
return max( dp[ n - 1 ][ 0 ], dp[ n - 1 ][ 1 ], dp[ n - 1 ][ 2 ] )
```