1. 程式人生 > 其它 >分治法解決最大子序和

分治法解決最大子序和

今天初嘗分支法,試了以下分治法求最大子序和,感覺確實比動態規劃好理解一點點

int getMaxSum2(int a[], int n) {
	if (n == 1) {
		return a[0];
	}
	return get(a, 0, n - 1);
}

int get(int a[], int left, int right) {
	//如果leftt等於right,說明只有這一個元素,返回它
	if (left == right) {
		return a[left];
	}
	//遞迴得求兩邊得最大和,每次求和都分兩半
	int mid = (left + right) / 2;
	int leftSum = get(a, left, mid);
	int rightSum = get(a, mid + 1, right);
	//所以每一個子陣列的最大子序列在左邊子陣列,右邊子陣列,橫跨中間的三種情況中出現
	int MaxLeftSum = 0;
	int MaxRightSum = 0;
	int tempMidSum = 0;
	for (int i = mid; i >= left; i--) {
		tempMidSum += a[i];
		if (tempMidSum > MaxLeftSum) {
			MaxLeftSum = tempMidSum;
		}
	}
	tempMidSum = 0;
	for (int i = mid+1; i <= left; i++) {
		tempMidSum += a[i];
		if (tempMidSum > MaxRightSum) {
			MaxRightSum = tempMidSum;
		}
	}
	int MaxMidSum = MaxRightSum + MaxLeftSum;
	return max(max(leftSum,rightSum),MaxMidSum);
}