注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
假定最大交易次数为k次,我们定义local[i][j]为在到达第i天时最多可进行j次交易并且最后一次交易在最后一天卖出的最大利润,此为局部最优。然后我们定义global[i][j]为在到达第i天时最多可进行j次交易的最大利润,此为全局最优。
transition equation:
diff = prices[i] - prices[i - 1];
local[i][j] = Max(global[i - 1][j - 1] + diff, local[i - 1][j] + diff);
global[i][j] = Max(global[i - 1][j], local[i][j]);
代码如下:- /*
- * j -- max # of transactions; i --- # of days;
- * local[i][j] -- profit achieved when selling at last day;
- * global[i][j] --- profit achieved at all situations;
- * transition equation:
- * local[i][j] = max(local[i - 1][j], global[i - 1][j - 1]) + diff;
- * (merge with previous transactions or NOT)
- * global[i][j] = max(local[i][j], global[i - 1][j]);
- */
- public class SolutionIV {
- public int maxProfit(int k, int[] prices) {
- int N = prices.length;
- if (k >= N)
- return simpleMaxProfit(prices);
- int[] local = new int[k + 1], global = new int[k + 1];
- int[] prevLocal = new int[k + 1], prevGlobal = new int[k + 1];
- for (int i = 1; i < N; ++i) {
- prevLocal = local; prevGlobal = global;
- local = new int[k + 1]; global = new int[k + 1];
- int diff = prices[i] - prices[i - 1];
- for (int j = 1; j <= k; ++j) {
- local[j] = Math.max(prevGlobal[j - 1], prevLocal[j]) + diff;
- global[j] = Math.max(local[j], prevGlobal[j]);
- }
- }
- return global[k];
- }
- int simpleMaxProfit(int[] prices) {
- int N = prices.length;
- if (N <= 1)
- return 0;
- int sum = 0;
- for (int i = 1; i < N; i++) {
- int diff = prices[i] - prices[i - 1];
- if (diff > 0)
- sum += diff;
- }
- return sum;
- }
- public static void main(String[] args) {
- SolutionIV sol = new SolutionIV();
- int[] nums = {4, 6, 1, 1, 4, 2, 5};
- System.out.println(sol.maxProfit(2, nums));
- }
- }
复制代码
|