动态规划:股票买卖问题(交易两次)——08

股票买卖问题(交易两次)

问题描述

  • 给定一个数组代表股票每天的价格,请问只能买卖两次的情况下,最大化利润是多少
  • 例如输入:{7,1,5,3,6,4}
  • 第一次交易 5 - 1 = 4 第二次交易 6 - 3 = 3
  • 最大利润为 4 + 3 = 7

算法思路

  • 其实在明白了交易一次的算法实现思路之后,对于交易两次就显得比较简单了。只需要不断的将该数组进行切分,切分为两个数组,分别计算两个数组交易一次的最大价值即可。
  • 首先定义dp1【i】矩阵,dp1【i】存储前 i 天交易一次的最大价值
  • 之后定义dp2【i】矩阵,dp2【i】存储从第 i 天到最后一天交易一次的最大价值
  • 然后不断的切分数组,求dp1【i】 + dp2【i + 1】的最大值即可

实现

public static int maxProfit1(int[] price){

    int[] dp1  = new int[price.length];
    dp1[0] = 0;
    int minPrice = price[0];

    //dp1[i]存储从0到i天交易一次的最大利润
    for(int i = 1; i < price.length; i++){

        dp1[i] = Math.max(price[i] - minPrice,dp1[i - 1]);

        if(price[i] < minPrice) minPrice = price[i];
    }



    int[] dp2 = new int[price.length];
    dp2[price.length - 1] = 0;
    int maxPrice = price[price.length - 1];

    //dp2[i]存储从i到 price.length 天交易一次的最大利润
    for( int i = price.length - 2; i >= 0; i--){

        dp2[i] = Math.max(maxPrice - price[i],dp2[i + 1]);

        if(price[i] > maxPrice) maxPrice = price[i];
    }

    int maxValue = 0;
    //切分数组
    for(int i = 0; i < price.length - 1; i++){

        maxValue = Math.max(maxValue,dp1[i] + dp2[i+1]);
    }

    return maxValue;



}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值