309. 最佳买卖股票时机含冷冻期
难度中等1044
给定一个整数数组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
*思路
*思路
代码
class Solution {
public:
int maxProfit(vector<int>& prices) {
// // 方法一 动态规划
if(prices.size() ==0) return 0;
int n = prices.size();
// int[][] dp = new int[n][3];
vector<vector<int>> dp(prices.size(),vector<int>(3));
// // 搞清楚下面三个状态很重要!!!
// // dp[i][0]: 第i天收盘后手上还持有一只股票时的累计最大收益
// // dp[i][1]: 第i天收盘后手上没有持有股票但是处于冷冻期时的累计最大收益
// // dp[i][2]: 第i天收盘后手上没有股票并且不是冷冻期时的累计最大收益
// // 第0天分析上面三种可能的状态
// // 第0天是dp[0][0] = -price[0] (第零天是起始天,你手上持有股票只有可能
// // 是当天开盘后现买的股票,买东西花钱所以是负收益)
// // 再来想想剩下的两个状态dp[0][1] dp[0][2] 处于冷冻期的条件是之前手上已
// // 经买了股票并且在前一天已经卖出了,而第0天你不买股票当然也不是冷冻期,所
// // 以第0天这两种状态下累计最大收益都是0,没有意义所以我们可以省略
dp[0][0] = -prices[0];
// // 剩下就可以开始从第1天遍历动态规划转移方程了
// // 第i天做的所有操作都取决于第 i - 1 天的状态
for(int i = 1; i < n; ++i) {
// // 状态一:第i天手上持有股票,要么是第i - 1天手上就持有了。要么是第i - 1
// // 天手上没股票并且不是冷冻期那就第i天收盘前先买所以要减去price[i]
dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
// // 状态二:第i天手上没股票并且属于冷冻期,那么说明只有第i - 1天手上持有
// // 了一只股票,在第i天收盘前卖掉,收盘后第i天才能进入冷冻期
dp[i][1] = dp[i - 1][0] + prices[i];
// // 状态三:第i天收盘后手上没股票也不是冷冻期,说明要么第i - 1天是冷冻期,
// // 第i天就解冻了并且手上没股票,要么就是第第i - 1天就不持有股票也不是冷
// // 冻期
dp[i][2] = max(dp[i - 1][1], dp[i - 1][2]);
}
// // 为什么不考虑第n天手上还持有一只股票的状态一呢,因为落袋为安,都到最后一天了你还拿到手上不卖出,
// // 没转换成钱,它就只是股票份额,何来的收益
return max(dp[n - 1][1], dp[n - 1][2]);
}
};