二维数组最大子数组的和首尾相连

#include<iostream>

using namespace std;

#define N 4

 

void maxhe(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][N];

    for(int i=0;i<N;i++)

    {

        for(int j=0;j<N;j++)

        {

            a[i][j]=rand()%6;

            if(rand()%2==1)

                a[i][j]=a[i][j]*(-1);

        }

    }

    cout<<"随机生成的二维数组为:"<<endl<<endl;

    for(int i=0;i<N;i++)

    {

        for(int j=0;j<N;j++)

        {

            cout<<a[i][j]<<"  ";

        }

        cout<<endl;

    }///////////////////////////////////////////////二维数组生成

    

    

    int max=a[0][0],c1=0,c2=0,l1=0,l2=0;

    for(int i=0;i<N;i++)

    {

        for(int j=i;j<N;j++)

        {

            int b[N]={0};////////////////定义可以存放各行相加和的数组

            for(int k=0;k<N;k++)

            {

                for(int l=i;l<=j;l++)

                {

                    b[k]+=a[l][k];

                }

                cout<<b[k]<<" ";

 

                int s=b[0],jmin=0,jmax=0;

                maxhe(b,s,jmin,jmax);

                if(s>=max)

                {max=s;c1=jmin;c2=jmax;l1=i;l2=j;}

            }

            cout<<endl;

        }

    }

 

    cout<<"二维数组最大和为:"<<max<<endl;

    for(int i=l1;i<=l2;i++)

    {

        for(int j=c1;j<=c2;j++)

        {

            cout<<a[i][j%N]<<"  ";

        }

        cout<<endl;

    }

}

 

成员:宋雨佳  周雪莹

思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。

感受:每次都是她来编程,下次我一定自己编,不管能不能做出来吧,总得试试。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。