LeetCode—— 309 最佳买卖股票时机含冷冻期

问题描述:

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

输入: [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

执行结果:

LeetCode—— 309 最佳买卖股票时机含冷冻期_第1张图片

代码描述:

思路:设天数是days, days行3列的数组,每一列表示该天的一种可能的状态,卖了,买了,冷冻期, 对应的dp[days][j] = val, val则表示当前的收益, 且在计算过程中,处于累加状态,所以最后就是取j = 0列,或者j = 2列。

class Solution {
public:
    int maxProfit(vector& prices) {
        if(prices.size() == 0)  return 0;
        const int len = prices.size();
        // i 表示天数,j {0,1,2}, 没有股票,有股票, 冷冻
        // dp[i][j] = val ,当前拥有的值
        int dp[len][3];
        memset(dp, 0, sizeof(int) * len * 3);
        dp[0][0] = 0;
        dp[0][1] = -prices[0];//没有股票就卖了,然后就是首天的负值,初始化0或其他负值会报错
        dp[0][2] = 0;
        for(int i = 1; i < len; ++i)
        {
            // 第i天不持有股票的情况,分为两种:
            // a 第 i -1 天也不持有股票
            // b 第 i -1 天是冷冻期
            dp[i][0] = max(dp[i-1][0], dp[i-1][2]);

            // 第i天持有股票的两种情况
            // a 第i-1天也持有股票,不操作
            // b 第i-1天不持有股票,第i天买入
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);

            // 第i天是冷冻期,只有会中情况,第 i-1天持有股票,且卖出
            dp[i][2] = dp[i-1][1] + prices[i];
        }
        return max(dp[len-1][0], dp[len-1][2]);    // 最后一天是卖出,或者是无交易。
    }
};

 

你可能感兴趣的:(LeetCode解题报告)