题目:给出一个数组,求出最大非连续子数组,返回该子数组元素之和。要求子数组中元素在原数组中不能相邻。
示例:数组{3,5,7,9,-2},最大非连续子数组为{5,9},返回14.
思路:使用max数组记录截止到第i个元素时,最大非连续子数组元素之和,max[0]=arr[0],max[1]=Max(max[0],arr[1]),
max[i]=Max(max[i-1],max[i-2]+arr[i])
可以采用递归或者使用数组动态规划的方式来解。
递归方式:
int Rec_GetMax(vector<int> arr,int opt) {
if (opt == 0) {
return arr[0];
}
else if(opt==1){
return arr[0] > arr[1] ? arr[0] : arr[1];
}
else
{
int A = Rec_GetMax(arr, opt - 1);
int B = Rec_GetMax(arr, opt - 2) + arr[opt];
return A > B ? A : B;
}
}
数组动态规划方式:
int NoRec_GetMax(vector<int> arr,int len) {
int *max = new int[len];
max[0] = arr[0];
max[1] = arr[0] > arr[1] ? arr[0] : arr[1];
for (int i = 2;i <= len;i++) {
max[i] = max[i - 1] > (max[i - 2] + arr[i]) ? max[i - 1] : (max[i - 2] + arr[i]);
}
return max[len];
}