Java描述 LeetCode,123. Best Time to Buy and Sell Stock IV(买卖股票的时机IV)

Java描述 LeetCode,123. Best Time to Buy and Sell Stock IV(买卖股票的时机IV),第1张

Java描述 LeetCode,123. Best Time to Buy and Sell Stock IV(买卖股票的时机IV)

大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力。

1-1:题目

You are given an integer array prices where prices[i] is the price of a given stock on the ith day, and an integer k.

Find the maximum profit you can achieve. You may complete at most k transactions.

Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).

Example 1:

Input: k = 2, prices = [2,4,1]
Output: 2
Explanation: Buy on day 1 (price = 2) and sell on day 2 (price = 4), profit = 4-2 = 2.

Example 2:

Input: k = 2, prices = [3,2,6,5,0,3]
Output: 7
Explanation: Buy on day 2 (price = 2) and sell on day 3 (price = 6), profit = 6-2 = 4. Then buy on day 5 (price = 0) and sell on day 6 (price = 3), profit = 3-0 = 3.

Constraints:

0 <= k <= 100
0 <= prices.length <= 1000
0 <= prices[i] <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv

1-2:idea

有了买卖股票3作为铺垫,这道题就比较容易了,我们只需要把各种状态通过第二个维度扩展出来即可。

public static int maxProfit(int k, int[] prices) {
        int n = prices.length;
        if (n == 0) {
            return 0;
        }
        // dp[i][j]代表第i天,
        // j代表第i天第状态,共五种。
        // - 0:当天无交易
        // - 1:第一次买入
        // - 2:第一次卖出
        // - 3:第二次买入
        // - 4:第二次卖出
        // - ....
        int[][] dp = new int[n + 1][2 * k + 1];


        // initialization
        for (int i = 0; i < dp[0].length; i++) {
            if (i % 2 == 1) {
                dp[1][i] = -prices[0];
            }
        }
        System.out.println(Arrays.deepToString(dp));
        for (int i = 2; i < n + 1; i++) {
            int price = prices[i - 1];
            dp[i][0] = dp[i - 1][0];
            for (int j = 1; j <= 2 * k; j++) {
                // j is odd
                if (j % 2 == 1) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - price);
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] + price);
                }
            }
//            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - price);
//            dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + price);
//            dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - price);
//            dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + price);
        }
        System.out.println(Arrays.deepToString(dp));
        return dp[n][2 * k];
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4970050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存