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

动态规划

class Solution {
    public int maxProfit(int k, int[] prices) {

        if (prices.length == 0){
            return 0;
        }

        int[][] dp = new int[prices.length][2 * k + 1];

        for (int i = 1; i < 2 * k + 1; i += 2) {
            dp[0][i] = -prices[0];
        }

        /**
         * 对《123. 买卖股票的最佳时机III》进行推广
         * 总共有2 * k + 1种状态,奇数买入或者持有,偶数卖出
         * dp[i][0]:没有操作
         * dp[i][1]:已买过一次,可能是之前买的,可能是之前没买今天买
         * dp[i][2]:已卖过一次,可能是之前卖的,可能是之前买过今天卖
         * ...
         */
        for (int i = 1; i < prices.length; i++) {

            dp[i][0] = dp[i - 1][0];

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

        return dp[prices.length - 1][2 * k];
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O(n^2)
 */

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/

posted @ 2022-02-28 17:05  振袖秋枫问红叶  阅读(30)  评论(0)    收藏  举报