求非連續最大子數組

題目:給出一個數組,求出最大非連續子數組,返回該子數組元素之和。要求子數組中元素在原數組中不能相鄰。

示例:數組{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];
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章