题目描述:
数组中整数有正有负求一连续子段,使得和最大化
例如:
2,4,-7,5,2,-1,2,-4,3
最大连续段:
5,2,-1,2
数组中整数有正有负求一连续子段,使得和最大化
例如:
2,4,-7,5,2,-1,2,-4,3
最大连续段:
5,2,-1,2
其最大和为8
代码:
#include<bits/stdc++.h>
int a[9] = {2,4,-7,5,2,-1,2,-4,3};
int f(int a[],int start,int end)
{
if(end - start == 1)
{
if(a[start] > 0)return a[start];
return 0;
} //递归出口
int m = (start + end)/2;
int t1 = f(a,start,m);
int t2 = f(a,m,end); //左半边和右半边的连续和最大值
int t3a = 0;
int sum = 0;
for(int i = m ; i >= start ; i--)
{
sum += a[i];
if(sum > t3a)t3a = sum;
}
int t3b = 0;
sum = 0;
for(int i = m + 1 ; i <= end ; i++)
{
sum += a[i];
if(sum > t3b)t3b = sum;
}
int t3 = t3a + t3b; //以下标为m的元素为中心的连续和的最大值
int max = t3;
if(t1 > max)max = t1;
if(t2 > max)max = t2;
return max;
}
int main()
{
printf("%d\n",f(a,0,9));
return 0;
}