高频leetcode动态规划部分:309. 买卖股票时机含冷冻期

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]);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值