188. 买卖股票的最佳时机 IV(动态规划)

结合 123. 买卖股票的最佳时机 III(动态规划)更好理解

III 中要求是最多2次交易,本题中是最多k次交易,只需要将状态扩展到2*k+1即可,其余操作都是一样的。

注意:在初始化的时候,遍历奇数位状态不能在for循环的判断语句中判断,因为不符合条件会直接跳出循环导致初始化失败,应该在自增操作中进行约束。

class Solution {
    public int maxProfit(int k, int[] prices) {
        int n = prices.length;
        int[][] dp = new int[n + 1][2 * k + 1];

        // dp[0][0] = 0; // 无操作
        // dp[0][1] = -prices[0]; // 第一次买入
        // dp[0][2] = 0; // 第一次卖出,当天买当天卖
        // dp[0][3] = -prices[0]; // 第二次买入,当天买卖一次后,又一次买入
        // dp[0][4] = 0; // 第二次卖出,当天两次买卖

		// 注意约束条件的位置
        // for (int i = 0; i < 2 * k + 1 && i % 2 == 1; ++i) {
        for (int i = 1; i < 2 * k + 1; i += 2) {
            dp[0][i] = -prices[0];
        }

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

你可能感兴趣的:(LeetCode,动态规划,算法)