算法Day51 | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费, 股票总结

Day51

    • 309.最佳买卖股票时机含冷冻期
    • 714.买卖股票的最佳时机含手续费
    • 股票总结

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

题目链接:309.最佳买卖股票时机含冷冻期
dp数组
dp[i][0]i天持有股票
dp[i][1]i天不持有股票且处于冷冻期
dp[i][2]i天不持有股票且不处于冷冻期

递推公式
dp[i][0] = max(dp[i - 1][0], dp[i - 1][2] - prices[i])i - 1天持有股票,第i天不操作或第i - 1天不持有股票且不处于冷冻期,第i天买入
dp[i][1] = dp[i - 1][0] + prices[i]i - 1天持有股票,第i天卖出
dp[i][2] = max(dp[i - 1][2], dp[i - 1][1])i - 1天不持有股票且不处于冷冻期,第i天不操作或第i - 1天不持有股票且处于冷冻期,第i天不操作

初始化
dp[0][0] = -prices[0], dp[0][1] = 0, dp[0][2] = 0

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

有一维数组:

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

循环中的dp[1]一定要用tmp保存,因为dp[2]的状态是dp[2]和之前的dp[1]决定的,而不是dp[1]经过dp[0] + prices[i]处理之后的。


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

题目链接:714.买卖股票的最佳时机含手续费

卖出时多一个手续费的支出

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

股票总结

通过二维数组来维护状态。通过i-1天状态来维护i天状态。

其实一维数组也可以,就像01背包中的二维数组压缩成一维数组一样。

你可能感兴趣的:(刷题日志,算法,leetcode,数据结构,c++,动态规划)