Sicily1005. 最大和题解

1. 题目描述

从数列A[0], A[1], A[2], …, A[N-1]中选若干个数,要求相邻的数不能都选,也就是说如果选了A[i], 就不能选A[i-1]和A[i+1]. 求能选出的最大和. 1 <= N <= 100000, 1 <= A[i] <= 1000

2. 样例输出

例1:A = {2, 5, 2},答案为5.
例2:A = {2, 5, 4},答案为6.

3. 分析

题目给了一个数组,需要从中挑选若干个元素,使元素之和最大,并且挑选的元素彼此之间不能相邻。
可以有以下几种情况:

  • 数组为空的时候,显然,返回值为0;
  • 数组只有一个元素,返回值则为该元素A[0];
  • 数组有两个元素的时候,由于我们挑选的元素不能相邻,因此,只能两个里面挑选一个最大的数,即返回值为max(A[0], A[1]);
  • 当有超过3个元素的时候进行下面的进一步分析:

假设数组为:A[0], A[1], A[2], A[3], A[4], A[5]……A[n-1],一共有n个元素,每一次选择的时候都只和当前元素A[i]以及前面的两个元素A[i-2]与A[i-3]有关。例如A[0], A[1], A[2], A[3]的时候,我们需要比较A[0]与A[1]哪个大哪个小(因为不相邻,不可能选择A[2]),如果A[1]>A[0],那么A[3] += A[1],否则A[3] += A[1]。通过这种方式就能使A[i]保存了第i个为止不相邻元素之和最大的数值。

总结出来:

当前元素A[i],需要判断A[i-2]与A[i-3]的大小;
i从3开始并且A[2] = A[0] + A[2];

if (A[i-2] >= A[i-3])     A[i] += A[i-2]
if (A[i-3] >= A[i-2])     A[i] += A[i-3]

这里写图片描述

4. 源码

class Solution {
public:
    int maxSum(vector<int>& A) {
        if (A.empty() == true) {
            return 0;
        }
        else if (A.size() == 1) {
            return A[0];
        }
        else if (A.size() == 2) {
            if (A[0] >= A[1]) {
                return A[0];
            }
            else {
                return A[1];
            }
        }
        A[2] = A[0] + A[2];
        for (int i = 3; i < (int)A.size(); i++) {
            if (A[i-2] > A[i-3]) {
                A[i] += A[i-2];
            }
            else {
                A[i] += A[i-3];
            }
        }
        if (A[A.size() - 2] > A[A.size()-1]) {
            return A[A.size() - 2];
        }
        else {
            return A[A.size() - 1];
        }
    }
};

5. 心得

机考顺利做出两道签到题就好啦……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值