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;
}
}