package LeetCode.DPpart11; /** * 123. 买卖股票的最佳时机 III * 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. * 设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。 * 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 * */ public class BestTimetoBuyandSellStockIII_123 { public int maxProfit(int[] prices) { int len = prices.length; // 边界判断, 题目中 length >= 1, 所以可省去 if (prices.length == 0) return 0; /* * 定义 5 种状态: * 0: 没有操作, 1: 第一次买入, 2: 第一次卖出, 3: 第二次买入, 4: 第二次卖出 */ int[][] dp = new int[len][5]; dp[0][1] = -prices[0]; // 初始化第二次买入的状态是确保 最后结果是最多两次买卖的最大利润 dp[0][3] = -prices[0]; for (int i = 1; i < len; i++) { dp[i][1] = Math.max(dp[i - 1][1], -prices[i]); dp[i][2] = Math.max(dp[i - 1][2], dp[i][1] + prices[i]); dp[i][3] = Math.max(dp[i - 1][3], dp[i][2] - prices[i]); dp[i][4] = Math.max(dp[i - 1][4], dp[i][3] + prices[i]); } return dp[len - 1][4]; } }
package LeetCode.DPpart11; /** * 188. 买卖股票的最佳时机 IV * 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格,和一个整型 k 。 * 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。 * 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 * */ public class BestTimetoBuyandSellStockIV_188 { public int maxProfit(int k, int[] prices) { if (prices.length == 0) return 0; // [天数][交易次数][是否持有股票] int len = prices.length; int[][][] dp = new int[len][k + 1][2]; // dp数组初始化 // 初始化所有的交易次数是为确保 最后结果是最多 k 次买卖的最大利润 for (int i = 0; i <= k; i++) { dp[0][i][1] = -prices[0]; } for (int i = 1; i < len; i++) { for (int j = 1; j <= k; j++) { // dp方程, 0表示不持有/卖出, 1表示持有/买入 dp[i][j][0] = Math.max(dp[i - 1][j][0], dp[i - 1][j][1] + prices[i]); dp[i][j][1] = Math.max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - prices[i]); } } return dp[len - 1][k][0]; } }
标签:int,part11,len,prices,length,123,Math,day50,dp From: https://www.cnblogs.com/lipinbigdata/p/17464828.html