代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV 309.买卖股票的最佳时机含冷冻期 714.买卖股票的最佳时机含手续费

188.买卖股票的最佳时机IV

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp数组的含义:
    • dp[j][2*i-1] 表示第i次持有股票
    • dp[j][2*i] 表示第i次不持有股票
  • 递推公式:
    • dp[j][2i-1] = max(dp[j-1][2i-1], dp[j-1][2*i-2] - prices[j]);
    • dp[j][2i] = max(dp[j-1][2i], dp[j-1][2*i-1] + prices[j]);
  • 初始化:
    持有股票初始化为-prices[0]
  • 遍历顺序:从小到大遍历
  • 打印dp数组
class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        // dp数组dp[0][0]:不操作
        // dp[0][2 * i - 1]:第i次持有
        // dp[0][2 * i]: 第i次不持有
        vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
        
        // 初始化2 * i - 1初始化为-prices[0];
        for(int i = 1; i <= k; ++i) {
            dp[0][2 * i - 1] = -prices[0];
        }

        for(int j = 1; j < prices.size(); ++j) {
            for(int i = 1; i <= k; ++i) {
                dp[j][2*i-1] = max(dp[j-1][2*i-1], dp[j-1][2*i - 2] - prices[j]);
                dp[j][2*i] = max(dp[j-1][2*i], dp[j-1][2*i - 1] + prices[j]);
            }
        }

        return dp[prices.size()-1][2*k];
    }
};

309.买卖股票的最佳时机含冷冻期

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp数组的含义
    • dp[j][0] 持有股票
    • dp[j][1] 保持卖出股票
    • dp[j][2] 具体卖出股票
    • dp[j][3] 冷冻期
  • 递推公式:
    • dp[j][0] = max(dp[j-1][0], max(dp[j-1][3] - prices[j], dp[j-1][1] - prices[j]));
    • dp[j][1] = max(dp[j-1][3], dp[j-1][1]);
    • dp[j][2] = dp[j-1][0] + prices[j];
    • dp[j][3] = dp[j-1][2];
  • 初始化
    • dp[0][0] = -prices[0];
    • dp[0][1] = 0;
    • dp[0][2] = 0;
    • dp[0][3] = 0;
  • 遍历顺序:从前向后
  • 打印dp数组
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(), vector<int>(4, 0));

        // 初始化
        dp[0][0] = -prices[0];

        for(int j = 1; j < prices.size(); ++j) {
            dp[j][0] = max(dp[j-1][0], max(dp[j-1][3] - prices[j], dp[j-1][1] - prices[j]));
            dp[j][1] = max(dp[j-1][3], dp[j-1][1]);
            dp[j][2] = dp[j-1][0] + prices[j];
            dp[j][3] = dp[j-1][2];
        }

        // 打印dp数组
        for(auto vec : dp) {
            for(int val : vec) cout << val << " ";
            cout << endl;
        }
        return max(dp[prices.size() - 1][2], max(dp[prices.size() - 1][1], dp[prices.size() - 1][3]));
    }
};

714.买卖股票的最佳时机含手续费

题目链接 文章讲解 视频讲解

动规五部曲:

  • dp数组的含义
    • dp[j][0] 持有股票
    • dp[j][1] 不持有股票
  • 递推公式:
    • dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
    • dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
  • 初始化
    • dp[0][0] = -prices[0];
    • dp[0][1] = 0;
  • 遍历顺序:从前向后遍历
  • 打印dp数组
class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        // dp[j][0] 持有股票
        // dp[j][1] 不持有股票
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));

        // 递推公式
        // dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
        // dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);

        // 初始化
        dp[0][0] = -prices[0];

        for(int j = 1; j < prices.size(); ++j) {
            dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
            dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
        }
        
        return dp[prices.size() - 1][1];
    }
};
posted @ 2024-07-03 21:31  深蓝von  阅读(1)  评论(0编辑  收藏  举报