分治法解決最大子序和
阿新 • • 發佈:2021-10-11
今天初嘗分支法,試了以下分治法求最大子序和,感覺確實比動態規劃好理解一點點
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); }