算法机考模拟题1005.最大和

来源:互联网 发布:淘宝刷到一天能赚多少 编辑:程序博客网 时间:2024/06/08 19:23
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];      }  };