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