代码随想录算法训练营 Day 50 | 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III

讲解链接:代码随想录-123.买卖股票的最佳时机III

public int maxProfit(int[] prices) {
    int[][] dp = new int[prices.length][5];
    // 0 第一次持有股票 1 第一次不持有股票  2  第二次持有股票 3 第二次不持有股票。
    dp[0][0] = -prices[0];
    dp[0][1] = 0;
    dp[0][2] = -prices[0];
    dp[0][3] = 0;
    for (int i = 1; i < prices.length; i++) {
        // 持有股票,根据 前一天持有的余额 和 今天股票价格的负数 比较,取最大值
        dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
        // 不持有股票,获根据 前一天不持有股票 和 前一天持有股票加上今天股票价格 比较,取最大值
        dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        // 第二次持有股票,根据 前一天第二次持有股票和前一天不持有股票减去今天股票价格,取最大值
        dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] - prices[i]);
        // 第二次不持有股票,根据 前一天第二次不持有股票 和 前一天第二次持有股票加上当天股票价格 比较,取最大值
        dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] + prices[i]);
    }

    return dp[prices.length - 1][3];
}

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

讲解链接:代码随想录-188.买卖股票的最佳时机IV

public int maxProfit(int k, int[] prices) {
    int[][] dp = new int[prices.length][k * 2];
    for (int i = 0; i < k; i++) {
        dp[0][i * 2] = -prices[0];
    }
    for (int i = 1; i < prices.length; i++) {
        for (int j = 0; j < dp[i].length; j++) {
            if (j % 2 == 0) {
                if (j == 0) {
                    dp[i][j] = Math.max(dp[i - 1][j], -prices[i]);
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
                }
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
            }
        }
    }
    return dp[dp.length - 1][k * 2 - 1];
}

你可能感兴趣的:(算法)