Description
从数列A[0], A[1], A[2], ..., A[N-1]中选若干个数,要求相邻的数不能都选,也就是说如果选了A[i], 就不能选A[i-1]和A[i+1]. 求能选出的最大和.
1 <= N <= 100000, 1 <= A[i] <= 1000
请为下面的Solution类实现解决上述问题的函数maxSum,函数参数A是给出的数列,返回值为所求的最大和.
class Solution {
public:
int maxSum(vector<int>& A) {
}
};
例1:A = {2, 5, 2},答案为5.
例2:A = {2, 5, 4},答案为6.
注意:你只需要提交Solution类的代码,你在本地可以编写main函数测试程序,但不需要提交main函数的代码. 注意不要修改类和函数的名称.
动态规划,相邻数不可同时被选,那么遍历数组,记录当前最大和,比较写出状态转移方程即可。
class Solution {
public:
int maxSum(vector<int>& A) {
if (A.size() == 0) return 0;
vector<int> f(A.size());
f[0] = A[0];
f[1] = A[0] > A[1] ? A[0] : A[1];
for (int i = 2; i < A.size(); i++) {
f[i] = f[i - 1] > (f[i - 2] + A[i]) ? f[i - 1] : (f[i - 2] + A[i]);
}
return f[A.size() - 1];
}
};