最大子数组
问题描述:
对给定数组A,寻找A的和最大的非空连续子数组。
输入格式:
输入的第一行包括一个整数n,代表数组中的元素个数,接下来的一行包含n个整数(可以包含负数),以空格分隔。
输出格式:
一个整数,表示最大的连续子数组的和。
样例输入:
9
2 4 -7 5 2 -1 2 -4 3
样例输出:
8
分析
利用分治的思想,划分为小段数组l-mid的最大值与mid+1-r和l-r作比较,比较之后返回上层循环一直到整个数组。
代码
#include<iostream>
using namespace std;
//找到l-r有关mid中的最大值
int FindMidMax(int a[], int l, int r, int mid){
int LmidMax = -1000;
int RmidMax = -1000;
int sum = 0;
//左数组中的从mid开始的最大值
for(int i=mid; i>=l; i--){
sum += a[i];
if(sum>LmidMax){
LmidMax = sum;
}
}
//右数组中的从mid开始的最大值
sum = 0;
for(int i=mid+1; i<r; i++){
sum += a[i];
if(sum>RmidMax){
RmidMax = sum;
}
}
return RmidMax+LmidMax;
}
int FindMaxSum(int a[], int l, int r){
if(l==r) return a[l];
int mid = (l+r)/2;
int LeftMax = FindMaxSum(a, l, mid);
int RightMax = FindMaxSum(a, mid+1, r);
int MidMax = FindMidMax(a, l, r, mid);
if(LeftMax>=RightMax && LeftMax>=MidMax)
return LeftMax;
else if(RightMax>=LeftMax && RightMax>=MidMax)
return RightMax;
else
return MidMax;
}
int main(){
int N;
int a[100];
cin>>N;
for(int i=1; i<=N; i++)
cin>>a[i];
int sum = FindMaxSum(a, 1, N);
cout<<sum;
return 0;
}