Sicily 最大和 | 期末算法机考模拟题

来源:互联网 发布:seo超级管家 编辑:程序博客网 时间:2024/06/09 16:43

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.

Thinking

本题考查动态规划,要求找出能得到最大和的选择方法。设置两个数组用于存储不同的选择情况。
将题目给的数组遍历一次;
数组a存储的是不选择当前这个数时的总和;因为不选当前的数字,所以前一个数字可选也可以不选,取总和较大的情况即可。(即max(a[i - 1], b[i- 1])
数组b存储的是选择当前这个数时的总和;所以前一个数字必定没有选,即总和为b[i] = a[i - 1] + A[i];
最后的结果从a[s -1],b[s - 1]中选出较大的一个即可。

Solution

class Solution {public:    int maxSum(vector<int>& A) {        int s = A.size();        int a[s];         int b[s];        a[0] = 0;        b[0] = A[0];        for(int i = 1; i < s; i++){            a[i] = max(a[i - 1], b[i - 1]);            b[i] = a[i - 1] + A[i];        }        return max(a[s - 1], b[s - 1]);    }};          
原创粉丝点击