您的位置:首页 > 其它

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

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

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

问题描述:

不限定买卖次数,如何获得最大收益,收益最大是多少;

只进行一次买卖,最大收益是多少;

只进行两次买卖,最大收益是多少;

问题一

对数组进行处理,令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】

由于代码比较简单,这里不再详述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: