zoukankan      html  css  js  c++  java
  • 关于商品买卖最大收益的问题

    给定【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】

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

  • 相关阅读:
    盒子阴影——Box-shadow
    Flex布局
    常用正则表达式
    选择器
    上传头像功能
    利用百度地图API获取用户浏览器所在省市区
    Android Studio编译运行卡慢的解决方案
    Laravel5.5 解决时区设置差8个小时解决办法
    Git:远程代码与本地冲突常见解决方法
    vue-element-admin解决跨域问题
  • 原文地址:https://www.cnblogs.com/fengkang1008/p/4855945.html
Copyright © 2011-2022 走看看