0
点赞
收藏
分享

微信扫一扫

代码随想录算法训练营第五十一天 | 买卖股票3

JakietYu 2023-05-25 阅读 51
leetcode

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

思路

动规五部曲

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

    dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]

    具体可以区分出如下四个状态:

    • 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
    • 不持有股票状态,这里就有两种卖出股票状态
      • 状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期)
      • 状态三:今天卖出股票
    • 状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
  2. 确定递推公式(直接根据下面这张图可以退出)

    在这里插入图片描述

    代码

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
            dp[0][0] = 0 - prices[0];
            dp[0][1] = 0; dp[0][2] = 0; dp[0][3] = 0;
    
            for(int i = 1; i < prices.size(); i++){
                dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
                dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
                dp[i][2] = dp[i - 1][0] + prices[i];
                dp[i][3] = dp[i - 1][2];
            }
            return max(dp[prices.size() - 1][0],
                    max(dp[prices.size() - 1][1],
                    max(dp[prices.size() - 1][2], dp[prices.size() - 1][3]
                    )));
        }
    };
    

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

代码

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
        dp[0][0] = 0 - prices[0];

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

        return max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]);
    }
};
举报

相关推荐

0 条评论