int Max_Subarray_Sum(int arr[], int n)
{
if(n == 1)
{
return arr[0]; // what it will be return for right Sub array
}
int m = n / 2;
int left_MSS = Max_Subarray_Sum(arr, m);
int right_MSS = Max_Subarray_Sum(arr + m, n - m); // why arr+m will d0
int leftsum = INT_MIN, rightsum = INT_MIN, sum = 0;
for(int i = m; i < n; i++)
{
sum += arr[i];
rightsum = max(rightsum, sum);
}
sum = 0;
for(int i = (m-1); i >= 0; i--)
{
sum += arr[i];
leftsum = max(leftsum,sum);
}
}
我无法理解这段代码,arr + m会做什么。
请帮帮我。
提前谢谢。
答案 0 :(得分:1)
您可以将arr
视为指向整数数组起点的指针。 arr + m
表示数组中m
元素的地址,因此基本上将数组拆分为两部分:
在数组的第一个m
元素上调用递归函数:
int left_MSS = Max_Subarray_Sum(arr,m);
在数组的最后n-m
个元素上调用递归函数:
int right_MSS = Max_Subarray_Sum(arr+m,n-m);
答案 1 :(得分:0)
int Max_Subarray_Sum(int arr[],int n)
{
if(n==1)
{
return arr[0]; // what it will be return for right Sub array
}
int m = n/2;
int left_MSS = Max_Subarray_Sum(arr,m);
int right_MSS = Max_Subarray_Sum(arr+m,n-m); // why arr+m will d0
return left_MSS + right_MSS;
}
这应该有效。你忘了添加最后一个回报。我也删除了for循环,因为它的结果将被丢弃。 此函数将数组拆分为子数组,直到它只包含1个值。
答案 2 :(得分:0)
更正功能:
int Max_Subarray_Sum(int arr[],int n)
{
if(n==1)
{
return arr[0]; // what it will be return for right Sub array
}
int m = n/2;
int left_MSS = Max_Subarray_Sum(arr,m);
int right_MSS = Max_Subarray_Sum(arr+m,n-m); // why arr+m will d0
return left_MSS + right_MSS;
}
说明: 比如,第一次通话:Max_Subarray_Sum({4,2,5},3)
Max_Subarray_Sum({4, 2, 5}, 3)
= Max_Subarray_Sum({4}, 1) + Max_Subarray_Sum({2, 5}, 2)
= 4 + Max_Subarray_Sum({2}, 1) + Max_Subarray_Sum({5}, 1)
= 4 + 2 + 5
= 11