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

一、题目及要求:

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

    输入一个二维整形数组,数组里有正数也有负数;二维数组首尾相接,像一条首尾相接的带子一样。

二、设计思路:

    把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括(如,第一行是1和4,第二行是3和5,这样就相连)。最后在加上没有包括的

#include<iostream>
using namespace std;
struct point
{
    int x, y;
};

int add(int a[5][5], int i, int j, int k)
{
    int n;
    int b = 0;
    for (n = j; n <= i + j; n++)
    {
        b += a[n][k];
    }
    return b;
}

void main ()
{
        int x=5,y=5,i, j, k, l;
        int sum = 0, s, h, e;
        point head;
        point end;
        int a[5][5];
        int b[5];
        cout << "请输入数组中的数:" << endl;
        for (i = 0; i<x; i++)
        {
            for (j = 0; j<y; j++)
            {
                cin>>a[i][j];
            }
        }
        for (i = 0; i<x; i++)
        {
            for (j = 0; i + j<x; j++)
            {
                s = 0;
                h = 0;
                e = 0;
                for (k = 0; k<y; k++)
                {
                    b[k] = add(a, i, j, k);
                }

                for (l = 0; l<x; l++)
                {
                    s += b[l];
                    if (s>0)
                    {
                        e++;
                    }
                    else
                    {
                        s = 0;
                        h = l + 1;
                        e++;
                    }
                    if (s>sum)
                    {
                        sum = s;
                        head.x = h;
                        head.y = j;
                        end.x = e;
                        end.y = i + j;
                    }
                }
                if (s>0 && h != 0)
                {
                    l = 0;
                    e = e - x;
                    while (s>0 && e != h - 1)
                    {
                        s += b[l];
                        l++;
                        e++;
                        if (s>sum)
                        {
                            sum = s;
                            head.x = h;
                            head.y = j;
                            end.x = e;
                            end.y = i + j;

                        }

                    }

                }

            }

        }
        cout<<"最大子数组的和为:"<<sum<<endl;
        cout<<"最大子数组为:"<<endl;
        if (end.x>head.x)
        {
            for (i = head.y; i <= end.y; i++)
            {
                for (j = head.x; j<end.x; j++)
                {
                    cout<<a[i][j]<<" ";
                }
                cout << endl;
            }
        }
        else
        {
            for (i = head.y; i <= end.y; i++)
            {
                for (j = head.x; j < x; j++)
                {
                    cout << a[i][j] << " ";
                }
                for (j = 0; j < end.x; j++)
                {
                    cout << a[i][j] << " ";
                }
                cout << endl;
            }
        }
        system("pause");
}

四、运行结果

五、感想

 这次编写代码时明显感觉到了困难,因为二维联通数组的情况更为多变使得好多情况必须考虑,因此增加了编程的难度。

结对开发伙伴:朱建颖 http://www.cnblogs.com/zjy666/

原文地址:https://www.cnblogs.com/wooder/p/5610582.html