首尾相连最大子数组和(3)
#include<iostream> using namespace std; #define N 4 void max(int a[],int &s,int &jmin,int &jmax) { int sum=a[0],b=a[0],x=0,y=0; int j=1; while((j-x<N)&&x<N) { if(b>=0) { b=a[j%N]; if(j<N) x=j; else break; } else b+=a[j%N]; if(sum>=b) { sum=b;y=j;} j++; } sum=0; for(int i=y+1;i<x+N;i++) sum+=a[i%N]; s=sum;jmin=y+1;jmax=x+N-1; int z=y%N; if(x>=z) { j=1;sum=a[0];b=a[0];x=0;y=0; while(j<N) { if(b<0) { b=a[j%N];x=j;} else b+=a[j%N]; if(sum<=b) { sum=b;y=j;} j++; } s=sum;jmin=x;jmax=y; } else if((x==0)&&(y==(N-1))) { sum=a[0];b=a[0];x=0;y=0; for(int o=1;o<N;o++) { if(a[o]>sum) {sum=a[o];x=o;y=o;} } s=sum;jmin=x;jmax=y; } } int main() { int a[N]={0,0,0,0}; cout<<"随机产生数组为:"; for(int i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; int s=a[0],jmin=0,jmax=0; max(a,s,jmin,jmax); cout<<"相应子数组为:"; cout<<jmin<<endl<<jmax<<endl; for(int i=jmin;i<=jmax;i++) cout<<a[i%N]<<" "; cout<<endl; return 0; }
设计思路:介于第一次与第二次都有类似的问题,于是将两次的代码结合,互相弥补。
后感:前两次的程序都有相同的问题,但是两个程序是互补的,所以将两个程序结合,再出现问题,继续改。。。。。。