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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import java.util.Arrays;
public class _188买卖股票的最佳时机IV {
public int maxProfit_gov(int k, int[] prices) { if (prices.length == 0) { return 0; } int n = prices.length; k = Math.min(k, n / 2); int[][] buy = new int[n][k + 1]; int[][] sell = new int[n][k + 1];
buy[0][0] = -prices[0]; sell[0][0] = 0; for (int i = 1; i <= k; ++i) { buy[0][i] = sell[0][i] = Integer.MIN_VALUE / 2; }
for (int i = 1; i < n; ++i) { buy[i][0] = Math.max(buy[i - 1][0], sell[i - 1][0] - prices[i]); for (int 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[n - 1]).max().getAsInt(); }
public int maxProfit(int k, int[] prices) { int len = prices.length; int kLen = k * 2; int[] dp = new int[kLen]; for (int i = 0; i < kLen; i += 2) { dp[i] = -prices[0]; dp[i + 1] = 0; } for (int i = 1; i < len; i++) { dp[0] = Math.max(dp[0], -prices[i]); dp[1] = Math.max(dp[1], dp[0] + prices[i]); for (int j = 2; j < kLen; j += 2) { dp[j] = Math.max(dp[j], dp[j - 1] - prices[i]); dp[j + 1] = Math.max(dp[j + 1], dp[j] + prices[i]); } } return dp[k * 2 - 1]; }
public static void main(String[] args) { _188买卖股票的最佳时机IV maxProfit = new _188买卖股票的最佳时机IV();
System.out.println(maxProfit.maxProfit(2, new int[]{1, 2, 4, 2, 5, 7, 2, 4, 9, 0})); } }
|