您的位置:首页 > 其它

Sicily1005. 最大和题解

2017-06-18 13:50 225 查看

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. 心得

机考顺利做出两道签到题就好啦……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sicily 算法