结对编程之返回一个二维数组中所有子矩阵和的最大值

题目:返回一个整数数组中最大子数组的和。
要求:
  输入一个整形数组,数组里有正数也有负数。
  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求:
  两人结对完成编程任务。
  一人主要负责程序分析,代码编程。
  一人负责代码复审和代码测试计划。
一、设计思想
  求二维数组最大子数组的和,可以转化为求一维数组最大子数组的和
      我们有一个最初的二维数组a[n][m],找它的 最大子数组之和
  1.我们先建立一个新的二维数组b[n][m],二维数组b[j][k] 存放的是a[j][k](0<=j<n,0<=k<m) 这一点到 a[0][0] 的最大值

  2.循环:从a[0][0]开始 以此是 a[0][1]、 a[0][2]……a[0][m]、

                a[1][0]、 a[1][1]……a[1][m]、

                a[2][0]、 a[2][1]……a[2][m]、

                  ……

                a[n][0]、 a[n][1]……a[n][m]、

       具体循环工作:当循环到a[j][k](0<=j<n,0<=k<m)则求的是 a[j][k]到 a[0][0] 的最大值

       计算方法:根据b[j-1][k]、b[j][k-1]、b[j-1][k-1]的正负情况,来计算b[j][k],根据包含a[j][k]的各种矩阵情况,求得最大值。

       3.求出b[m][n]中的最大值。

二、程序代码

#include "stdafx.h"
#include<iostream.h>
int main(int argc, char* argv[])
{
    int i,j;
    int a[3][3]={-1,-2,3,1,-3,2,4,4,-1};
    int b[3][3];
    int max=a[0][0];
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<a[i][j]<<' ';
        }
        cout<<endl;
    }
    for(i=0;i<1;i++)
    {
        b[0][0]=a[0][0];
        for(j=0;j<3;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<3;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];
                }
            }
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            cout<<b[i][j]<<" ";
        }
        cout<<endl;
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            if(b[i][j]>max)
                max=b[i][j];
        }
    }
    cout<<"max="<<max<<endl;
    return 0;      

}

三、运行结果截图

测试:数组全为正数,数组全为负数

四、心得体会

        首先是设计思想,一开始我们思路比较混乱,先找到一共有多少个子矩阵,想着怎么样才能把整个数组的所有子矩阵都遍历一遍,也不知道具体怎么样用程序实现。

课上有同学介绍他们自己的思路,使我们确定了一条可以执行的思路。

       程序的编写具有极大挑战性,由于是二维数组,行列老是弄混,元素想加时情况又多,要随时注意思路清晰。

    

 

转载于:https://www.cnblogs.com/luyu2783/p/4360478.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值