#include<iostream>
#include<vector>
using namespace std;
const int Min=-99999;
void MaxSum(const vector<int>&v,int &besti,int &bestj,int& sum,int low,int high)
{
int i;
if(low==high) //当low==high,递归截止,sum存放一个元素和
{
sum=v[low];
return;
}
else if(low<high) //当low<high,产生递归
{
int mid=(low+high)/2; //mid是low...high区间的中值
int lsum;
MaxSum(v,besti,bestj,lsum,low,mid); //左区间递归,求low...mid区间最大子段和
int rsum;
MaxSum(v,besti,bestj,rsum,mid+1,high);//右区间递归,求mid+1...high区间最大子段和
//最大子段和可能出现在i...j中,low<=i<=mid, mid<j<=high
int lbestsum=Min; //lbestsum是i...mid区间最大子段和
int s=0; //s用于求和
int L_index; //L_index...mid区间是最大子段和区间
for(i=mid;i>=low;i--) //求i...mid区间最大子段和
{
s+=v[i];
if(s>lbestsum)
{
L_index=i;
lbestsum=s;
}
}
int rbestsum=Min; //rbestsum是mid+1...high区间最大子段和
s=0;
int R_index; //mid_1...R_index区间是最大子段和区间
for(i=mid+1;i<=high;i++)
{
s+=v[i];
if(s>rbestsum)
{
R_index=i;
rbestsum=s;
}
}
if(lsum>rsum && lsum>(lbestsum+rbestsum)) //最大子段和是出现在low...mid区间内
{
besti=low;
bestj=mid;
sum=lsum;
}
else if(rsum>lsum && rsum>(lbestsum+rbestsum)) //最大子段和是出现在mid+1...high区间内
{
besti=mid+1;
bestj=high;
sum=rsum;
}
else
{
besti=L_index;
bestj=R_index;
sum=lbestsum+rbestsum;
}
}
}
void main()
{
vector<int>v;
int i,j,sum;
sum=0;
int e;
const int end=-9999;
cin>>e;
while(e!=end)
{
v.push_back(e);
cin>>e;
}
for(i=0;i<v.size();i++) cout<<i<<":"<<v[i]<<endl;
MaxSum(v,i,j,sum,0,v.size()-1);
cout<<"最大子段和从位置"<<i<<"到"<<"位置"<<j<<endl;
cout<<"最大子段和是:"<<sum<<endl;
}
最大子段和(分而治之求解)
原创
©著作权归作者所有:来自51CTO博客作者我是006的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
洛谷P1115-最大子段和(DP-最大子段和)
题目描
#include 数据 #define -
JAVA最大子段和
...
最大字段和 i++ 子段 字段 java