一、思路
本题属于动态规划题目。可以想到利用一个一维数组dp[i],数组中的下标i对应着目标数组中当前元素所能取到的和的最大值。
那么要求当前元素能求到的和的最大值,其实就是求出当前元素前面的不相邻的元素所能取到的不相邻元素的和的最大值,再加上当前元素的值,就是当前元素所能取到的不相邻元素之和的最大值。
二、代码
#include <iostream>
using namespace std;
int ArrSum(int arr[], int len){
int dp[len]; // dp包含每个元素当前所能取到的不相邻元素之和的最大值
dp[0] = arr[0]; // 边界条件
dp[1] = arr[1]; // 边界条件
for(int i = 2; i <= len; ++i){ // 从第三个元素开始求每个元素对应的当前位置所能取到的不相邻元素的最大值
int max = 0; // 当前元素所能取到的不相邻元素的最大值
for(int j = i - 2; j >= 0; --j){ // 遍历当前元素前面不相邻元素所能取到的和的最大值
if(max < dp[j] + arr[i]){ // 找出当前元素对应的和的最大值
max = dp[j] + arr[i];
}
}
dp[i] = max; // 当前结果赋值给dp
}
return dp[len - 1]; // 返回结果
}