#include"iostream"
#include"stdio.h"
using namespace std;
const int inf=9999999;
const int mxn=10000+10;
struct MS
{
int begin;
int end;
int sum;
MS(int b,int e,int s)
{
begin=b;
end=e;
sum=s;
}
MS()
{
}
};
MS f(int *a ,int low ,int high)
{
if(low==high)
return MS(low,high,a[low]);
else
{
int mid=(low+high)/2;
MS maxl,maxr,maxm;
maxl=f(a,low,mid);
maxr=f(a,mid+1,high);
int i,sum,midl=-inf,midr=-inf,midli=mid,midri=mid+1;
sum=0;
for(i=mid;i>=low;i--)
{
sum+=a[i];
if(sum>midl)
{
midl=sum;
//cout<<"midl:"<<midl<<" ";
midli=i;
}
}
sum=0;
for(i=mid+1;i<=high;i++)
{
sum+=a[i];
if(sum>midr)
{
midr=sum;
//cout<<"midr:"<<midr<<" ";
midri=i;
}
}
//cout<<endl;
maxm=MS(midli,midri,midl+midr);
if((maxl.sum>=maxr.sum)&&(maxl.sum>=maxm.sum))
return maxl;
else if((maxr.sum>=maxl.sum)&&(maxr.sum>=maxm.sum))
return maxr;
else
return maxm;
}
}
int main()
{
int t;
while(scanf("%d",&t)==1&&t) //输入长度
{
int a[mxn];
int i;
for(i=0;i<t;i++) //输入元素
scanf("%d",a+i);
MS ts=f(a,0,t-1);
cout<<ts.sum<<" "<<a[ts.begin]<<" "<<a[ts.end]<<endl;
}
return 0;
}
分治 求最大连续和。
最新推荐文章于 2020-02-26 18:21:20 发布