算法训练1-day35-动态规划

26 阅读1分钟
  1. 188. 买卖股票的最佳时机 IV123. 买卖股票的最佳时机 III类似,不过是扩展到了k次交易,可以用2*k+1个空间来记录各种状态

AC代码:

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        // dp[i][0]代表不操作
        // dp[i][2*j-1]代表持有股票的最大利润
        // dp[i][2*j]代表不持有股票的最大利润
        vector<vector<int>> dp(n, vector<int>(2 * k + 1));
        for (int j = 1; j <= k; j++) {
            dp[0][2 * j - 1] = -prices[0];
        }

        for (int i = 1; i < n; ++i) {
            for (int j = 1; j <= k; ++j) {
                dp[i][2 * j - 1] =
                    max(dp[i - 1][2 * j - 1], dp[i - 1][2 * j - 2] - prices[i]);
                dp[i][2 * j] =
                    max(dp[i - 1][2 * j], dp[i - 1][2 * j - 1] + prices[i]);
            }
        }
        return dp[n - 1][2 * k];
    }
};
  1. 309. 买卖股票的最佳时机含冷冻期

多记录一个冷冻期的状态,买入是由冷冻期转移而来,冷冻期则是由上一次的冷冻期或是卖出状态转移而来

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        // dp[i][0] 买入
        // dp[i][1] 卖出
        // dp[i][2] 冷冻期
        vector<vector<int>> dp(n, vector<int>(3));
        dp[0][0] = -prices[0];
        for (int i = 1; i < n; ++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] = max(dp[i - 1][2], dp[i - 1][1]);
        }

        return max(dp[n - 1][1], dp[n - 1][2]);
    }
};
  1. 714. 买卖股票的最佳时机含手续费

122. 买卖股票的最佳时机 II类似,不过多了一个手续费,在卖出时减去就好

代码如下:

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