您的位置:首页 > 其它

2.14 求子数组之和的最大值

2012-09-13 17:33 295 查看
#include <iostream>
using namespace std;
int maxsum(int *src,int n,int &spos,int &epos)
{
int start,all,i,tmppos;
all=start=src[n-1];
tmppos=spos=epos=n-1;
for(i=n-2;i>=0;i--)
{
if(start>=0)
{
start+=src[i];
}
else
{
start=src[i];
tmppos=i;
}
if(start>all)
{
all=start;
epos=tmppos;
spos=i;
}
}
return all;
}
int max(int a, int b, int c)
{
if(a>b)
{
if(a>c)
return a;
}
else
{
if(b>c)
return b;
return c;
}
}
void toneg(int *src,int len)//整个数组取反
{
for(int i=0;i<len;i++)
{
src[i]=-1*src[i];
}
}
int ext1(int *src, int n)
{
int tmp,s,e,sum1=0,sum2=0,sum3=0;
for(int i=0;i<n;i++)//解就是整个数组的和
{
sum1+=src[i];
}
cout<<sum1<<endl;

sum2=maxsum(src,n,s,e);//解没有跨过SRC[N-1];
cout<<sum2<<endl;

toneg(src,n);
tmp=maxsum(src,n,s,e);
tmp=-1*tmp;
sum3=sum1-tmp;//解是从数组中删掉一块和为负数且绝对值最大的子数组
cout<<sum3<<endl;
return max(sum1,sum2,sum3);
}
int main()
{
int startpos,endpos;
int s1[]={1,-2,3,5,-3,2};
int s2[]={0,-2,3,5,-1,2};
int s3[]={-9,-2,-3,-5,-3};
cout<<"s1 all:"<<maxsum(s1,6,startpos,endpos)<<endl;
cout<<"start:"<<startpos<<" end:"<<endpos<<endl;
cout<<"s2 all:"<<maxsum(s2,6,startpos,endpos)<<endl;
cout<<"start:"<<startpos<<" end:"<<endpos<<endl;
cout<<"s3 all:"<<maxsum(s3,5,startpos,endpos)<<endl;
cout<<"start:"<<startpos<<" end:"<<endpos<<endl;

cout<<"ext1 s1:"<<ext1(s1,6)<<endl;
cout<<"ext1 s2:"<<ext1(s2,6)<<endl;
cout<<"ext1 s3:"<<ext1(s3,5)<<endl;
return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: