题解 | #不相邻最大子序列和#

不相邻最大子序列和

http://www.nowcoder.com/practice/269b4dbd74e540aabd3aa9438208ed8d

从例子进行分析
3,[1,2,3]
在index = 0,有两种选择:
取 得到取值 1
不取 得到取值 0

 这个位置能拿到的最大收益就是1

在index = 1,也有两种选择:
取 (此时,由于相邻的两个下标是不能取的,因此,得到的值只能是 2 +(index = -1的最大收益)= 2
不取 那到目前位置(此时可能获得的收益就是index = 1的最大收益),取值就是 1

这个位置能拿到的最大收益就是2

在index = 2,也有两种选择:
取 此时得到的值就是 3 + (index = 0取,时得到的最大收益 = 1) = 4
不取 此时得到的值就是 0 + (index = 1取,时得到的最大收益 = 2) = 2

因此,最大收益就是4

另一个例子

4,[4,2,3,5]
index=0
不取 0
取 4
这个位置能拿到的最大收益就是4
index = 1
不取 4
取 2
这个位置能拿到的最大收益就是 4
index = 2
不取 4
取 4+3 = 7
这个位置能拿到的最大收益就是7

index = 3
不取 7
取 4+5 = 9
这个位置能拿到的最大收益就是9

代码如下:

    long long subsequence(int n, vector<int>& array) {
        // write code here
        int first = 0; //i-2的最大收益
        int second = 0; //i-1的最大收益
        int max_value = 0;
        for(int i = 0;i<array.size();i++){
            int temp_max = max(second, first + array[i]);
            max_value = max(temp_max, max_value);
            first = second;
            second = temp_max;
        }
        return max_value;
    }

再简化下:

    long long subsequence(int n, vector<int>& array) {
        // write code here
        int first = 0;
        int second = 0;
        for(int i = 0;i<array.size();i++){
            int temp_max = max(second, first + array[i]);
            first = second;
            second = temp_max;
        }
        return second;
    }
全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务