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] <= 10002. 样例输出
例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 1005. 最大和(week 20)
- sicily 1005. 无路可逃?
- sicily 递归练习 1005. Arithmetic Expression Evaluation
- sicily考试模拟题-1003相连的1 1004isDAG? 1005相邻的数 1006单词变换
- Sicily 1005. Roll Playing Games
- 【Sicily】1005. 最大和
- Sicily 1005 Roll Playing Games
- 【Sicily】1005. 最大和
- sicily 1150,1151
- 递归 1005
- Sicily 1001. Alphacode
- sicily 1014 Specialized Four-Dig
- sicily 1017. Rate of Return
- Sicily 1028. Hanoi Tower Sequence【高精度取余和除法】
- Sicily 1443
- PAT 1005. 继续(3n+1)猜想 (25)
- sicily 1459. The Dragon of Loowater
- Sicily 1641 Binary Searchable
- Sicily 3498 分解质因数 & 3496 鸡兔同笼
- sicily 1500. Prime Gap