代码随想录算法训练营第四十天-188买卖股票的最佳时机IV、309最佳买卖股票时机含冷冻期、714买卖股票的最佳时机含手续费
初步题解
188 买卖股票的最佳时机 IV
题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public int maxProfit(int k, int[] prices) { int[][] dp = new int[prices.length][2 * k]; for (int i = 0; i < k; i++) { dp[0][i * 2] = -prices[0]; } for (int i = 1; i < dp.length; i++) { dp[i][0] = Math.max(dp[i - 1][0], -prices[i]); for (int j = 1; j < 2 * k; j++) { if (j % 2 == 0) { dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]); } else { dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]); } } } System.out.println(Arrays.deepToString(dp)); return dp[prices.length - 1][2 * k - 1]; }
|
309 最佳买卖股票时机含冷冻期
题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown)
思路:买卖股票 + 打家劫舍结合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public int maxProfit(int[] prices) { int[][] dp = new int[prices.length][2]; dp[0][0] = -prices[0]; for (int i = 1; i < dp.length; i++) { if (i == 1) { dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]); } else { dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i]); } dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]); } System.out.println(Arrays.deepToString(dp)); return dp[prices.length - 1][1]; }
|
714 买卖股票的最佳时机含手续费
题目链接:(https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public int maxProfit(int[] prices, int fee) { int[][] dp = new int[prices.length][2]; dp[0][0] = -prices[0] - fee; for (int i = 1; i < dp.length; i++) { dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i] - fee); dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]); } System.out.println(Arrays.deepToString(dp)); return dp[prices.length - 1][1]; }
|
看解析
188 买卖股票的最佳时机 IV
解析:(https://programmercarl.com/0188.买卖股票的最佳时机IV.html)
309 最佳买卖股票时机含冷冻期
解析:(https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)
注意这里的每一个状态,例如状态一,是持有股票股票状态并不是说今天一定就买入股票,而是说保持买入股票的状态即:可能是前几天买入的,之后一直没操作,所以保持买入股票的状态。
达到买入股票状态(状态一)即:dp[i][0]
,有两个具体操作:
那么 dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);
达到保持卖出股票状态(状态二)即:dp[i][1],有两个具体操作:
达到今天就卖出股票状态(状态三),即:dp[i][2]
,只有一个操作:
昨天一定是持有股票状态(状态一),今天卖出,即:dp[i][2] = dp[i - 1][0] + prices[i]
;
达到冷冻期状态(状态四),即:dp[i][3]
,只有一个操作:
昨天卖出了股票(状态三), dp[i][3] = dp[i - 1][2];
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public int maxProfit(int[] prices) { if (prices == null || prices.length < 2) { return 0; } int[][] dp = new int[prices.length][2];
dp[0][0] = 0; dp[0][1] = -prices[0]; dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]); dp[1][1] = Math.max(dp[0][1], -prices[1]);
for (int i = 2; i < prices.length; i++) { dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]); dp[i][1] = Math.max(dp[i - 1][1], dp[i - 2][0] - prices[i]); }
return dp[prices.length - 1][0]; } }
|
714 买卖股票的最佳时机含手续费
解析:(https://programmercarl.com/0714.买卖股票的最佳时机含手续费(动态规划).html)