• 结对开发——求二维环形数组所有子矩阵最大和的问题


    一、题目要求:

      输入一个二维整形数组,数组里有正数也有负数。
      二维数组首尾相接,象个一条首尾相接带子一样。
      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
      求所有子数组的和的最大值。
      要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和。

    二、解决思路:

      由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果。

    三、程序代码:

    #include "stdafx.h"
    #include<iostream.h>
    int main(int argc, char* argv[])
    {
        int i,j;
        int a[3][5]={{1,-2,3},{1,-3,2},{4,-4,5}};
        int b[3][5];
        for(i=0;i<3;i++)
        {
         for(j=0;j<2;j++)
            a[i][j+3]=a[i][j];
        }
        int max=a[0][0];
        cout<<"初始二维数组为:"<<endl;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                cout<<a[i][j]<<' ';
            }
            cout<<endl;
        }
        cout<<"重构后环形数组为:"<<endl;
        for(i=0;i<3;i++)
        {
            for(j=0;j<5;j++)
            {
                cout<<a[i][j]<<' ';
            }
            cout<<endl;
        }
    
    
        for(i=0;i<1;i++)
        {
            b[0][0]=a[0][0];
            for(j=0;j<5;j++)
            {
                if(a[0][j-1]<0)
                {
                    b[0][j]=a[0][j];
                }
                else
                {
                    b[0][j]=b[0][j-1]+a[0][j];
                }        
            }
        }
        for(i=1;i<3;i++)
        {
            for(j=0;j<1;j++)
            {
                if(a[i-1][0]<0)
                {
                    b[i][0]=a[i][0];
                }
                else
                {
                    b[i][0]=b[i-1][0]+a[i][0];
                }
            }
        }
        for(i=1;i<3;i++)
        {
            for(j=1;j<5;j++)
            {
                if(b[i-1][j-1]<0)
                {
                    if(b[i-1][j]>=0&&b[i][j-1]>=0)
                    {
                        if(b[i][j-1]>=b[i-1][j])
                        {
                            b[i][j]=b[i][j-1]+a[i][j];
                        }
                        else
                        {
                            b[i][j]=b[i-1][j]+a[i][j];
                        }
                    }
                    else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                    {
                        b[i][j]=b[i-1][j]+a[i][j];
                    }
                    else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=b[i][j-1]+a[i][j];
                    }
                    else
                    {
                        b[i][j]=a[i][j];
                    }
                }
                else
                {
                    if(b[i-1][j]>=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
                    }
                    else if(b[i-1][j]>=0&&b[i][j-1]<=0)
                    {
                        b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
                    }
                    else if(b[i-1][j]<=0&&b[i][j-1]>=0)
                    {
                        b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
                    }
                    else
                    {
                        b[i][j]=a[i][j];
                    }
                }
            }
        }
        cout<<"子矩阵的和数组为:"<<endl;
        for(i=0;i<3;i++)
        {
            for(j=0;j<5;j++)
            {
                cout<<b[i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
        for(i=0;i<3;i++)
        {
            for(j=0;j<5;j++)
            {
                if(b[i][j]>max)
                    max=b[i][j];
            }
        }
        cout<<"最大子矩阵和为:"<<max<<endl;
        return 0;      
    
    }

    四、结果截图

    我们设置了一个容易观察的数组,环状之后和最初的完全不同,最大子矩阵也一目了然。

    五、心得体会:

      由于之前我们有过基础,所以这次感觉比较简单,无论是在思路上还是在编程过程中都感觉比较顺畅,所以花的时间不是太多,只是重构了个数组,然后简单修改了几个地方。
    在这个过程中,我和王雪青尤其感受到了良好的编程习惯和清晰的解决思路很重要,无论是对于代码重写,还是新增功能模块,都能很快的提高编程效率。

  • 相关阅读:
    天猫和淘宝有什么区别
    Oracle (内连接)
    共享受限资源,Brian的同步规则
    后台线程,优先级,sleep,yield
    runnable和thread的区别
    Oracle 左连接、右连接、全外连接、(+)号作用、inner join(等值连接) (转载)
    oracle创建表
    oracle常见错误
    GUID是什么意思及Guid在sqlserver中的使用
    表中查询重复的数据,如何通过sql语句查询?
  • 原文地址:https://www.cnblogs.com/luyu2783/p/4385234.html
Copyright © 2020-2023  润新知