使用分而治之的最大总和子数组,为什么要以不同的方式使用 for 循环,答案是错误的?

Maximum Sum Subarray using Divide & Conquer, why use for loop a different way, the answer is wrong?

本文关键字:方式使 for 答案 错误 循环 为什么 分而治之 数组      更新时间:2023-10-16
#include <bits/stdc++.h>
using namespace std;
int MaximumSum(int A[], int low, int high)
{
if (high == low)
return A[low];
int mid = (low + high) / 2;
int leftMax = INT_MIN;
int sum = 0;
for (int i = mid; i >= low; i--) 
{
sum += A[i];
if (sum > leftMax)
leftMax = sum;
}
/*
why not write this way? I know when coding like this, answer is wrong.
for (int i = low; i <= mid; i++)
{
sum += A[i];
if (sum > leftMax)
leftMax = sum;
}
*/
int rightMax = INT_MIN;
sum = 0;    // reset sum to 0
for (int i = mid + 1; i <= high; i++) 
{
sum += A[i];
if (sum > rightMax)
rightMax = sum;
}
int maxLeftRight = max(MaximumSum(A, low, mid), 
MaximumSum(A, mid + 1, high));
return max(maxLeftRight, leftMax + rightMax);
}
int main()
{
int arr[] = { -2,1,-3,4,-1,2,1,-5,4 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "The Maximum sum of the subarray is " << 
MaximumSum(arr, 0, n - 1);
return 0;
}

我的问题是在解决leftMax时,为什么不使用从低到中的for循环,正确版本和错误版本有什么区别,我知道按顺序循环是错误的,但我想知道为什么?我不知道为什么我不能提交...

你想计算中间点的子数组,所以对于左边的部分,你必须从右到左计算。 例如

[5, -42, 2, 0, 1, 2, 3]

零件是

[5, -42, 2, 0] [1, 2, 3]

对于[5, -42, 2, 0],从左到右计算给出5
,而从左到右计算给出2

所以包含 0 (mid( 的子数组总和是

[2, 0] + [1, 2, 3]

顺便说一句,您的算法不是最佳的,它可以以线性复杂性完成。