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


    一、题目及要求:

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

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

    二、设计思路:

        把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括(如,第一行是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/

  • 相关阅读:
    17.正则表达式
    16.os模块-shutil模块-tarfile压缩模块
    15.序列化模块-时间模块-zip压缩模块
    第一章 单变量线性回归
    如何跑通MonoRTM模型的官方例子
    PHP命名规范
    js中要声明变量吗?
    php抓取网站图片源码
    InnoDB和MyISAM区别总结
    php分页代码。
  • 原文地址:https://www.cnblogs.com/wooder/p/5610582.html
Copyright © 2020-2023  润新知