求非连续最大子数组

题目:给出一个数组,求出最大非连续子数组,返回该子数组元素之和。要求子数组中元素在原数组中不能相邻。

示例:数组{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];
}

猜你喜欢

转载自blog.csdn.net/lccrun/article/details/80881936