您的位置:首页 > 其它

给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。

2012-10-04 19:05 941 查看
给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列;如果都是负数,则输出最大和是0。

// 连续元素相加和为最大的序列(有正有负).cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

int max(int a,int b,int c)
{
double max_v=a;
if(b>a)
max_v=b;
if(c>max_v)
max_v=c;
return max_v;
}

int min(int a,int b,int c)
{
double min_v=a;
if(b<a)
min_v=b;
if(c<min_v)
min_v=c;
return min_v;
}

int Maxadd(int count,int *a,int &x,int &y)
{
int *Min=new int[count+1];//Min[i]代表以a[i]结尾的最小连续序列的和
int *Max=new int[count+1];//Max[i]代表以a[i]结尾的最大连续序列的和
Min[0]=a[0];
Max[0]=a[0];
int max_val=Max[0],maxpos=0;
for(int i=1;i<count;i++)
{
Max[i]=max(a[i],a[i]+Max[i-1],a[i]+Min[i-1]);
Min[i]=min(a[i],a[i]+Max[i-1],a[i]+Min[i-1]);
if(Max[i]>max_val)
{
max_val=Max[i];
maxpos=i;//以a[maxpos]结尾的连续序列和最大
}
}
int sum=a[maxpos],j=maxpos;
while(sum!=max_val)
{
j--;  //j是最大和连续子序列中的第一个下标
sum+=a[j];
}
x=j;
y=maxpos;
delete [] Max;
delete [] Min;
return max_val;
}

void main()
{
int maxsum;
int a[]={1,-2,3,5,-4,6};
int len=sizeof(a)/sizeof(a[0]);
//for(int j=0;j<len;j++)
//{
//    printf("%4d",a[j]);
//}
//printf("\n");
int num=0;
for(int k=0;k<len;k++)
{
if(a[k]<0)
num++;
}
if(num==len) //如果元素都是负数,则输出最大和是0。
maxsum=0;
else
{
int x=0,y=0;
maxsum=Maxadd(len,a,x,y);
for(int i=x;i<=y;i++)
{
printf("%4d",a[i]);//打印最大和的子序列
}
}
printf("\nmaxadd=%d\n",maxsum);;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐