算法随想Day45【动态规划】| LC309-最佳买卖股票时机含冷冻期、LC714-买卖股票的最佳时机含手续费

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

更多的状态转移:

  • dp[i] [0]含义:持有股票的最多现金
    • 分两种情况,一是昨天就持有,即dp[i - 1] [0]。二是昨天没持有(可能是昨天抛出了,或者是昨天之前更早抛出了),所以今天若要买新的股票,则起码要用前天抛出股票时剩的现金来购买,即 dp[i - 1] [2] - prices[i]
  • dp[i] [1]含义:今天抛出股票的最多现金
  • dp[i] [2]含义:昨天或昨天之前抛出股票的最多现金,即数值等于昨天抛出股票剩的现金dp[i - 1] [1]
int maxProfit(vector<int>& prices)
{
    int size = prices.size();
    vector<vector<int>> dp(size, vector<int>(3, 0));
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    dp[0][2] = 0;
    for (int i = 1; i < size; ++i)
    {
        dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
        dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        dp[i][2] = dp[i - 1][1];
    }
    return max(dp[size - 1][1], dp[size - 1][2]);
}

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

  • 含冷冻期,影响的是第 i 天购入时的现金(要用昨天之前剩的现金)
  • 含手续费,影响的是第 i 天抛出时的收益,要减去手续费

所以在本题中不用使用多一个变量记录昨天之前的抛出股票的现金,只需在“买卖股票的最佳时机Ⅱ”的基础上,在抛出股票时,减多一个手续费。

int maxProfit(vector<int>& prices, int fee)
{
    int size = prices.size();
    vector<vector<int>> dp(size, vector<int>(2, 0));
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    for (int i = 1; i < 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 dp[size - 1][1];
}
posted @ 2023-03-15 13:36  冥紫将  阅读(30)  评论(0)    收藏  举报