这个问题看了好久,太弱了~~,想解决这个最大连续和的问题,可以把这它分解为若干个子问题。
如上图,采用分治的方法可以减少很多重复的计算。
我们首先可以先找出所有元素的中点,也就是访问顺序为1的点,然后再按这个点,把原来的所有元素分为左右两部分。
再找出访问顺序为2的点,又把所有元素的左部分分成了两部分……
因为这些元素的最大连续和的区间,可能在这个中点左面,也可能在中点的右面,也可能在中点的左右各有一部分。
所以把这个问题分为三部分讨论。
想求它的最大连续和,要先把它中点左面的最大连续和求出来,还要把中点右面的最大连续和求出来,还要把中点左右各有一部分的最大连续和求出来……也就是开始所说的递归求子问题。
直到中点左右各有一个元素的时候,递归就结束了,直接返回对应的元素值。问题就可以解决咯~~
#include <stdio.h>
int a[100];
int gao(int x, int y)
{
if(y - x == 1)
{
return a[x];
}
int mid = (x+y) / 2;
int n = gao(x, mid);
int m = gao(mid, y);
int max = n > m ? n : m; //n,m分别代表某个状态下,中点左、右存在的最大连续和
int L = a[mid-1], R = a[mid]; //L,R分别代表某个状态下,从中点开始到左、右的最大连续和
int v = 0;
for(int i = mid - 1; i >= x; i--)
{
v += a[i];
if(L < v)
{
L = v;
}
}
v = 0;
for(int i = mid; i < y; i++)
{
v += a[i];
if(R < v)
{
R = v;
}
}
return max > (L+R) ? max : (L+R);
}
int main()
{
int n;
while(~scanf("%d", &n)) //读一个数n,接着跟n个数
{
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
printf("%d\n",gao(0, n));
}
return 0;
}