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

题目:
      返回一个二维整数数组中最大子数组的和。
要求:
      输入一个二维整形数组,数组里有正数也有负数。
      二维数组首尾相接,象个一条首尾相接带子一样。
      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
      求所有子数组的和的最大值。
思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。

(1)代码:

#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;
    }
}

原文地址:https://www.cnblogs.com/LJT666/p/4520495.html