动态规划-简单多状态dp问题 – 买卖股票的最佳时机含冷冻期
题目重现
题目链接:买卖股票的最佳时机含冷冻期 - 力扣
给定一个整数数组
prices
,其中第prices[i]
表示第*i*
天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: prices = [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:
输入: prices = [1] 输出: 0
提示:
1 <= prices.length <= 5000
0 <= prices[i] <= 1000
读懂题目
解决这道题首先我们需要特别注意冷却期的存在,卖出股票后,无法在第二天买入股票 (即冷冻期为 1 天), 这就意味着每次买入后自行转入可卖出状态需要经历一天时间。
于是我们画出三种不同状态之间的转化图如下:
算法流程
1.状态表示
对于此题,根据经验+题目要求,这里设定状态表示为 “以 i 位置为结尾 … …” 。结合题目所求最大利润的金额,所以设定 dp[i] 为第 i 天所能获得的最大利润。
但是由于题中对于每天都有三种不同的状态,于是 dp[i] 可以被细分为 dp[0] [i] 、dp[1] [i] 、dp[2] [i] 共对应三种不同的状态。
- dp[0] [i] 表示:第 i 天结束后,处于 “买入” 状态,此时的最大利润;
- dp[1] [i] 表示:第 i 天结束后,处于 “(可)卖出” 状态,此时的最大利润;
- dp[2] [i] 表示:第 i 天结束后,处于 “冷冻期” 状态,此时的最大利润。
2.状态转移方程
由于 “冷冻期” 属于过程中的一个状态,所以不必特殊关照。
- 处于 “买入” 状态时:
-
- 我们有两种选择:1.卖出股票;2.继续持有股票
- 处于 “卖出” 状态时:
-
- 有两种情况:1.冷冻期内,不能买入;2.非冷冻期内,可以买入