分享

买卖股票的最佳时机三

 激流一舟 2023-06-04 发布于中国香港

图片

导读 ^_^

买卖股票的系列问题三!
这回的限制是全局最多能买卖两次操作。

题目

leetcode 123图片

代码与思路

注意:这里的2次是最多两次

确定dp数组以及下标的含义

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

  1. 没有操作
  2. 第一次买入
  3. 第一次卖出
  4. 第二次买入
  5. 第二次卖出

递归公式

dp[i][1]状态,有两个具体操作:

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
  • 操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]

dp[i][2]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

同理可推出剩下状态部分:
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
图片

//买卖股票最佳时机III
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.size() == 0return 0;
        vector<vector<int>> dp(prices.size(), vector<int>(50));
        dp[0][1] = -prices[0];
        dp[0][3] = -prices[0];//相当于第0天买入买出,再买入
        for (int i = 1; i < prices.size(); i++) {
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
            dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
        }
        return dp[prices.size() - 1][4];//铁定是第二次卖出利润最大啊
        //如果最优的情况对应的是恰好一笔交易
        //那么它也会因为我们在转移时允许在同一天买入并且卖出这一宽松的条件
        //从状态1迁移到2
    }
};

#谢谢你的观看!

^_^

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多