最大子数组问题

来源:互联网 发布:开个网络超市 编辑:程序博客网 时间:2024/06/08 14:07
#include <iostream>using namespace std;int FindMaxCrossingSubarray(int A[], int low, int mid, int high){int MaxLeftSum = 0;//保存目前为止找到的最大和int LeftSum = 0;   //保存从最后一位往左的子数组的和for (int i = mid; i >= low; i--){LeftSum += A[i];if (LeftSum > MaxLeftSum){MaxLeftSum = LeftSum;}}int MaxRightSum = 0;int RightSum = 0;for (int j = mid + 1; j <= high; j++){RightSum += A[j];if (RightSum > MaxRightSum){MaxRightSum = RightSum;}}return MaxLeftSum + MaxRightSum;}int FindMaximumSubarray(int A[], int low, int high){int MaxLeftSum, MaxRightSum,MaxCrossSum;if (high == low){return A[low];}else{int mid = (low + high) / 2;MaxLeftSum = FindMaximumSubarray(A, low, mid);MaxRightSum = FindMaximumSubarray(A, mid + 1, high);MaxCrossSum = FindMaxCrossingSubarray(A, low, mid, high);}//返回三个之中最大的if (MaxLeftSum >= MaxRightSum&&MaxLeftSum >= MaxCrossSum){ return MaxLeftSum;}else if (MaxRightSum >= MaxLeftSum&&MaxRightSum >= MaxCrossSum){return MaxRightSum;}else{return MaxCrossSum;}}int main(){int A[16] = { 13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7 };int sum = FindMaximumSubarray(A,0,15);cout << sum << endl;system("pause");return 0;}