给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列;如果都是负数,则输出最大和是0。
1 // 连续元素相加和为最大的序列(有正有负).cpp : 定义控制台应用程序的入口点。 2 3 #include "stdafx.h" 4 5 int max(int a,int b,int c) 6 { 7 double max_v=a; 8 if(b>a) 9 max_v=b; 10 if(c>max_v) 11 max_v=c; 12 return max_v; 13 } 14 15 int min(int a,int b,int c) 16 { 17 double min_v=a; 18 if(b<a) 19 min_v=b; 20 if(c<min_v) 21 min_v=c; 22 return min_v; 23 } 24 25 int Maxadd(int count,int *a,int &x,int &y) 26 { 27 int *Min=new int[count+1];//Min[i]代表以a[i]结尾的最小连续序列的和 28 int *Max=new int[count+1];//Max[i]代表以a[i]结尾的最大连续序列的和 29 Min[0]=a[0]; 30 Max[0]=a[0]; 31 int max_val=Max[0],maxpos=0; 32 for(int i=1;i<count;i++) 33 { 34 Max[i]=max(a[i],a[i]+Max[i-1],a[i]+Min[i-1]); 35 Min[i]=min(a[i],a[i]+Max[i-1],a[i]+Min[i-1]); 36 if(Max[i]>max_val) 37 { 38 max_val=Max[i]; 39 maxpos=i;//以a[maxpos]结尾的连续序列和最大 40 } 41 } 42 int sum=a[maxpos],j=maxpos; 43 while(sum!=max_val) 44 { 45 j--; //j是最大和连续子序列中的第一个下标 46 sum+=a[j]; 47 } 48 x=j; 49 y=maxpos; 50 delete [] Max; 51 delete [] Min; 52 return max_val; 53 } 54 55 void main() 56 { 57 int maxsum; 58 int a[]={1,-2,3,5,-4,6}; 59 int len=sizeof(a)/sizeof(a[0]); 60 //for(int j=0;j<len;j++) 61 //{ 62 // printf("%4d",a[j]); 63 //} 64 //printf("\n"); 65 int num=0; 66 for(int k=0;k<len;k++) 67 { 68 if(a[k]<0) 69 num++; 70 } 71 if(num==len) //如果元素都是负数,则输出最大和是0。 72 maxsum=0; 73 else 74 { 75 int x=0,y=0; 76 maxsum=Maxadd(len,a,x,y); 77 for(int i=x;i<=y;i++) 78 { 79 printf("%4d",a[i]);//打印最大和的子序列 80 } 81 } 82 printf("\nmaxadd=%d\n",maxsum);; 83 }