其他分享
首页 > 其他分享> > 分治法解决最大子序和

分治法解决最大子序和

作者:互联网

今天初尝分支法,试了以下分治法求最大子序和,感觉确实比动态规划好理解一点点

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);
}

标签:MaxLeftSum,right,tempMidSum,int,分治,mid,解决,子序,left
来源: https://www.cnblogs.com/yumingkuan/p/15394850.html