算法作业_36(2017.6.16第十七周)(算法机考模拟题5)

1005. 最大和


从数列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) {
         int n  = A.size();
         int res = 0;
         vector<int> dp (n);
         if(n == 0) return 0;
         if(n == 1) return  A[0];
         if(n == 2) return max(A[0],A[1]);
         if(n == 3) return  max(A[1],A[0]+A[2]); 
            
         for( int i = 3; i < n ;i ++){
             dp[0] =  A[0];
             dp[1] = max(A[0],A[1]);
             dp[2] = max(A[1],A[0]+A[2]);
             dp[i] =  max ( (A[i]+dp[i-2]) , (A[i]+dp[i-3]));
         }
         
         for(int i = 0 ; i <n ; i ++){
             if(res <dp[i]){
                 res = dp[i];
             }
         }
         return res ; 
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值