关于商品买卖最大收益的问题

给定【2,4,7,8,7,10,5】这样一个序列,对于一件商品我们可以选择【买】【卖】【放弃】三种操作。

但是必须按照【买】【卖】的顺序进行

问题描述:

  1. 不限定买卖次数,如何获得最大收益,收益最大是多少;
  2. 只进行一次买卖,最大收益是多少;
  3. 只进行两次买卖,最大收益是多少;

问题一

对数组进行处理,令diff=nums[i]-nums[i-1];只要diff>0,便将其加到最终的结果即可;

2+3+1+3=9;即【2,8】【7,10】

代码如下:

int MaxSum(int *pNum, int len)
{
    if(NULL == pNum) return 0;

    if(1 == len) return 0;

    int ret = 0;
    int diff = 0;
    for(int i = 1; i < len; ++i)
    {
        diff = pNum[i] - pNum[i - 1];
        if(diff > 0)
        {
            ret += diff;
        }
    }

    return ret;
}

问题二

根据nums[i]-nums[i-1]重新生成一个序列,只进行一次买卖相当于求新序列的最大连续子段和;

2+3+1+(-1)+3=8,即【2,10】

代码如下:

int getDis(int A[], int n)
{
    // write code here
    int maxDis = 0;
    int dis = 0;
    for(int i = 1; i < n; ++i)
    {
        if(dis >= 0)
        {
            dis += A[i] - A[i - 1];
        }
        else
        {
            dis = A[i] - A[i - 1];
        }

        maxDis = max(maxDis, dis);
    }

    return maxDis;
}

问题三

这里介绍一下我的思路:在问题二的基础上,添加一层循环,用来控制将序列分成两部分。然后分别对左右部分进行问题二的操作,将两部分的最大收益值相加作为整个序列的最大利益。

根据对区间的不同划分,求出最大的利益;

6+3=9;即【2,8】【7,10】

由于代码比较简单,这里不再详述。

 

posted @ 2015-10-05 16:59  指上弹兵赵小括  阅读(373)  评论(0编辑  收藏  举报