天天看点

首尾相连最大子数组和(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;
}      

设计思路:介于第一次与第二次都有类似的问题,于是将两次的代码结合,互相弥补。

后感:前两次的程序都有相同的问题,但是两个程序是互补的,所以将两个程序结合,再出现问题,继续改。。。。。。