返回一个整数数组中最大子数组的和2

输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

#include <iostream>

#include <time.h>

using namespace std;

#define M 3

#define N 6

void main()

{

    int a[M][2*N]={0},b[2*N],d = 0,d1 = 0;

    int maxd[2*N]={0} ,end1[2*N] = {0},end2 = 0;

    int i_max = 0,j_max = 0 ,jj = -1,j1 = 0,j2 = -1;

    srand((unsigned int)time(0));   

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

    {

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

        {

            a[i][j] = rand()%50 - 25;

            a[i][j+N] = a[i][j];

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

        }   

        cout << endl;

    }

    maxd[0] = a[0][0];

    for (int i = 0;i < M;i++)//i为0,表示1行,i为1表示两行数···

    {

        for (int i_hang = 0;i_hang < M-i;i_hang++)//当1行是循环3次

        {

            for (int j = 0;j < 2*N;j++)//赋初值

            {

                b[j] = 0;

            }

            for (int i_hang1 = i_hang;i_hang1 <= i_hang+i;i_hang1++)//每次循环i次赋值

            {

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

                {

                    b[j] += a[i_hang1][j];

                }

            }

            d = 0;j2 = -1;j1=0;jj=-1;

            for (int ii = 0;ii < 2*N;ii++)

            {   

                d += b[ii];

                if (d > maxd[j1-1])

                {

                    maxd[j1] = d;

                    end1[j1] = ii;

                    i_max = i;       //最大的时候是i行;

                    j_max = i_hang;   //

                    j1++;

                    j2 = jj;

                }

                if(d < 0)

                {

                    d = 0;

                    jj = ii;

                }

                if (end1[j1-1] - j2 > N)   //如果end1[j1-1] - j2大于N个数,那么就获取end1[j1-2]

                {   

                    j1--;

                    break;

                }

            }

            end2 = j2+1;           

        }

    }   

    cout << "子数组为:" << endl;

   

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

    {

        for (int i = end2;i <= end1[j1-1];i++)

        {

            cout << a[j_max+k][i] << " ";

        }

        cout << endl;

    }

    cout << endl;

    cout << "和为: " << maxd[j1-1] << endl;   

}


原文地址:https://www.cnblogs.com/chengchengshuaio/p/4594919.html