|
|
|
@ -0,0 +1,37 @@
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
|
|
|
|
|
public class L0188 {
|
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
|
int k = 2;
|
|
|
|
|
int[] prices = { 2, 4, 1 };
|
|
|
|
|
|
|
|
|
|
System.out.print(maxProfit(k, prices));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int maxProfit(int k, int[] prices) {
|
|
|
|
|
|
|
|
|
|
if (prices.length == 0) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int num = prices.length;
|
|
|
|
|
int[][] buy = new int[num][k + 1]; // 对于第j次选择在第i天买入
|
|
|
|
|
int[][] sell = new int[num][k + 1];// 对于第j次选择在第i天卖出
|
|
|
|
|
|
|
|
|
|
int i, j;
|
|
|
|
|
for (i = 0; i <= k; ++i) {
|
|
|
|
|
buy[0][i] = -prices[0];// 第i次选择在第0天买入,此时有的钱为第0天前的负数;
|
|
|
|
|
sell[0][i] = 0;// 第i次选择在第0天卖出,此时赚的钱为0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 1; i < num; ++i) {
|
|
|
|
|
buy[i][0] = Math.max(buy[i - 1][0], sell[i - 1][0] - prices[i]); // 第0次选择在第i天买,max{第0次在i-1天买,
|
|
|
|
|
// 第0次在第i-1天处于卖出状态减去第i天的钱}
|
|
|
|
|
for (j = 1; j <= k; ++j) {
|
|
|
|
|
buy[i][j] = Math.max(buy[i - 1][j], sell[i - 1][j] - prices[i]);
|
|
|
|
|
sell[i][j] = Math.max(sell[i - 1][j], buy[i - 1][j - 1] + prices[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return Arrays.stream(sell[num - 1]).max().getAsInt();
|
|
|
|
|
}
|
|
|
|
|
}
|