递归,分治法,最大连续子数组

递归,分治法,最大连续子数组

最大值情况只有三种可能:

1.左边一半之中取的

2.右边一半之中取的

3.中间连续的取得

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int f(int *a,int from,int to);
int main()
{


    int object[10]={1,-2,3,10,-4,7,2,-5};//目标数组
    int re=0;
   re=f(object,0,7);
    cout <<re<<endl;
    return 0;
}

int f(int *a,int from,int to){//f函数功能:求出a数组from到to之间最大连续子数组的和
    int middle,left,right,now,m3,m1,m2;
    if(from==to){

        return a[from];
    }

middle=(from+to)/2;
 m1=f(a,from,middle);//递归求左边一半的最大值
 m2=f(a,middle+1,to);//递归求右边一半的最大值

//求中间连续的子数组的最大值
left=a[middle];now=a[middle];
for(int i=middle-1;i>=from;i--){
    now+=a[i];
    left=max(now,left);
}

right=a[middle+1];now=right;
for(int i=middle+2;i<=to;i++){
    now+=a[i];
    right=max(now,right);
}
 m3=left+right;

m1=max(m1,m2);
m1=max(m1,m3);
return m1;
}