Say you have an array for which the ith 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.
解题思路:利用动态规划思想。
假设dp[i][j]为在1—j+1天内最多交易i次所取得收益最大值,则
dp[i][j] = max{dp[i][j-1],temp + prices[j]}
temp = {temp,dp[i-1][j-1] + prices[j]}
class Solution {
public int maxProfit(int k, int[] prices) {
if(prices.length <= 0 || k <= 0) {
return 0;
}
if(k >= prices.length / 2) {
return quilkSolve(prices);
}
int[][] dp = new int[k+1][prices.length];
for(int i = 1;i <= k;i++) {
int tempMax = - prices[0];
for(int j = 1;j<prices.length;j++) {
dp[i][j] = Math.max(dp[i][j - 1],prices[j] + tempMax);
tempMax = Math.max(tempMax,dp[i - 1][j - 1] - prices[j]);
}
}
return dp[k][prices.length - 1];
}
public int quilkSolve(int[] prices) {
int maxProfit = 0;
for(int i = 1;i < prices.length;i++) {
if(prices[i] > prices[i - 1]) {
maxProfit += prices[i] - prices[i - 1];
}
}
return maxProfit;
}
}