动态规划—1.2 买卖股票的最佳时机

一、买卖股票的最佳时机——一次买卖机会

  给定一个代表股票价格的数组,只能进行一次买卖交易,求所能获取的最大利润。例如

A=[7,1,5,3,6,4]

  显然1时买入,6时卖出,利润最大。
  数组Am和An,关系为Am=[An,m],令An时,最低买入价为i,最高卖出价为o,最大利润为p=o-i。
  若m<i,因为出现了更低的买入价,则更新最低买入价,i=m。
  而最高卖出价则要每次都更新,因为需要不断的计算当前的利润来比较最大值。
  综上所述,状态转换方程为

An = [An-1, n]
o = n
if(i > n), i = n
p = max(p, o-i)

  代码如下

int maxProfit(int* prices, int pricesSize)
{
    int in = prices[0];
    int profits = 0;
    int i = 0;
    for(i=1; i<pricesSize; i++)
    {
        if(prices[i] < in)
            in = prices[i];
        profits = profits>(prices[i]-in)?profits:prices[i]-in;
    } 
    return profits;
}

二、买卖股票的最佳时机——多次买卖机会

  给定一个代表股票价格的数组,进行多次买卖交易,求所能获取的最大利润。
  例如,A=[7,1,5,3,6,4],1时买入,5时卖出,3时买入,6时卖出,利润最大。
  感觉比上题更简单,只要后面的卖出价高于买入价就交易,然后把利润相加。唯一需要注意的是当卖出后,需要把卖出价记录为新的买入价。
  状态转化方程

An = [An-1,n]
if(in > n), in = n
if(in < n), out = n
p += out-in
in = out

  代码如下

int maxProfit(int* prices, int pricesSize)
{
    int in = prices[0];
    int profits = 0;
    int i = 0;
    for(i=1; i<pricesSize; i++)
    {
        if(prices[i] > in)
            profits += (prices[i]-in);
        
        in = prices[i];     
    } 
    return profits;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值