递归,分治法,最大连续子数组
最大值情况只有三种可能:
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;
}