Best Time to Buy and Sell Stock IV

Say you have an array for which the i-th element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Example 1:

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

Example 2:

Input: [3,2,6,5,0,3], k = 2
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.

思路:如果K >= n / 2,代表我能够买卖的次数已经超过了我能够买卖的极限,也就是当天买,第二天有利润就卖。那么我可以一直买卖,见利就收。题目变成了Best Time to Buy and Sell Stock II, 如果次数比较小,那么就要用dp;

// dp[i][j], max profit which you can get until price j, at most i transaction;
 // dp[i][j] = Math.max(dp[i][j - 1], Math.max(price[j] - price[jj] + dp[i - 1][jj]); jj in range of[0, j - 1];
                //Math.max(dp[i][j - 1], price[j] + Max(dp[i - 1][jj] - price[jj]); jj in range of[0, j - 1];

class Solution {
    public int maxProfit(int k, int[] prices) {
        // dp[i][j], max profit which you can get until price j, at most i transaction;
        // dp[i][j] = Math.max(dp[i][j - 1], Math.max(price[j] - price[jj] + dp[i - 1][jj]); jj in range of[0, j - 1];
        //            Math.max(dp[i][j - 1], price[j] + Max(dp[i - 1][jj] - price[jj]); jj in range of[0, j - 1];
        
        int n = prices.length;
        if(k >= n / 2) {
            return resolve(prices);
        }
        int[][] dp = new int[k + 1][n];
        
        for(int i = 1; i <= k; i++) {
            int localmax = dp[i - 1][0] - prices[0];
            for(int j = 1; j < n; j++) {
                dp[i][j] = Math.max(dp[i][j - 1], prices[j] + localmax);
                localmax = Math.max(localmax, dp[i - 1][j] - prices[j]);
            }
        }
        return dp[k][n - 1];
    }
    
    private int resolve(int[] prices) {
        int profit = 0;
        for(int i = 1; i < prices.length; i++) {
            if(prices[i] - prices[i - 1] > 0) {
                profit += prices[i] - prices[i - 1];
            }
        }
        return profit;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值