分治训练:最大连续和

解题思路:给一串数,求其中最大的连续子串和。采用分治的思想,将序列分成左右两个部分,递归求得左右两边最大连续和,再遍历求起点在左终点在右的最大连续和,比较取最大值即得到结果。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

int s[100];

int maxsub(int a,int b){      //尤其注意,设计的是左闭右开的区间格式 
	if(b-a==1) return s[a];      //如果只包含一个数则直接返回 
	int mid=a+(b-a)/2;
	int max1=max(maxsub(a,a+(b-a)/2),maxsub(a+(b-a)/2,b));      //递归得到左右两边串最大值 
	int L=s[a+(b-a)/2-1],sum=0;
    for(int i=a+(b-a)/2-1;i>=a;i--)        //从中间出发往左边最大连续和 
    {
    	sum+=s[i];
    	L=max(L,sum);
	}
	int R=s[a+(b-a)/2];
	sum=0;
	for(int i=a+(b-a)/2;i<b;i++)      //从中间出发往右边最大连续和 
	{
		sum+=s[i];
    	R=max(R,sum);
	}
	return max(max1,L+R);   //L+R则表示起终点分别在两端的最大连续和 
} 

int main()
{
	int n;
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
		{
			cin>>s[i];
		}
		cout<<maxsub(0,n)<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mavises/article/details/81914222