买卖股票3
核心思路
- 和买卖股票23一样
- 区别只是变成k的可变的买卖次数了
解题代码
-
二维数组
javapublic int maxProfit(int k, int[] prices) { int[][] dp = new int[prices.length][2 * k + 1]; for (int i = 1; i < 2 * k + 1; i += 2) { dp[0][i] = -prices[0]; } for (int i = 1; i < prices.length; i++) { for (int j = 1; j < 2 * k + 1; j++) { if (j % 2 == 0) { dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1] + prices[i]); } else { dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1] - prices[i]); } } } return dp[prices.length - 1][2 * k]; } -
一维数组 其实和背包问题的一维数组解法思路一致
javapublic int maxProfit(int k, int[] prices) { int[] dp = new int[2 * k + 1]; for (int i = 1; i < 2 * k + 1; i += 2) { dp[i] = -prices[0]; } for (int i = 1; i < prices.length; i++) { for (int j = 1; j < 2 * k + 1; j++) { if (j % 2 == 0) { dp[j] = Math.max(dp[j], dp[j - 1] + prices[i]); } else { dp[j] = Math.max(dp[j], dp[j - 1] - prices[i]); } } } return dp[2 * k]; }
买卖股票4
核心思路
- 这一题主要是多了个冻结期, 要把状态搞明白
java
//dp[i][0]: 持有股票的最大现金
//dp[i][1]: 未持有股票之一: 前几天就卖了, 一直未持有的最大现金
//dp[i][2]: 未持有股票之二: 今天才卖的剩余现金
//dp[i][3]: 冷冻期 = dp[i-1][2]
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][4];
dp[0][0] = -prices[0];
dp[0][1] = 0;
dp[0][2] = 0;
dp[0][3] = 0;
for (int i = 1; i < prices.length; i++) {
//持有股票的最大现金
//1. 延续昨天的
//2. 前一天的状态2, 即一直就没买的剩余最大现金 - price[i]
//3. 前一天的冷冻期的现金 - price[i]
dp[i][0] = Math.max(dp[i - 1][0], Math.max(dp[i - 1][1] - prices[i], dp[i - 1][3] - prices[i]));
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] = dp[i - 1][0] + prices[i];
dp[i][3] = dp[i - 1][2];
}
return Math.max(dp[prices.length - 1][2], Math.max(dp[prices.length - 1][1],Math.max(dp[prices.length - 1][3],0)));
}
买卖股票5
核心思路
- 这一题主要是多了个手续费
- 需要考虑手续费是买入的时候出, 还是卖出的时候出, 其实是一样的
- 我选择买入的时候出手续费
java
public int maxProfit(int[] prices, int fee) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0] - fee;
dp[0][1] = 0;
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - fee - prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return dp[prices.length - 1][1];
}