• 软件工程结对开发之求二维数组中连续最大子数组之和


    一、题目:返回一个二维整数数组中最大子数组的和。

    项目成员:檀威,陈志利

    要求:
    输入一个整形数组,数组里有正数也有负数。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。
    结对编程要求:
    两人结对完成编程任务。
    一人主要负责程序分析,代码编程。
    一人负责代码复审和代码测试计划。
    发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周四3月26日24:00)
     
    二、设计思想:
    首先以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值了,并初始化为max[0][0]。
    三、代码:
    #include <iostream.h>
    int maxSubArray(int **a,int n,int m)
    {
    	int **p=new int*[n];
    	int i,j;
    	if(m==0||n==0)
    		return 0;
    	//计算p[i][j]	
    	for(i=0;i<n;i++)
    	{
    		p[i]=new int[m];
    		for(j=0;j<m;j++)
    		{
    			if(i==0)
    			{
    				if(j==0)
    					p[i][j]=a[i][j];
    				else
    					p[i][j]=p[i][j-1]+a[i][j];
    			}
    			else
    			{
    				if(j==0)
    					p[i][j]=p[i-1][j]+a[i][j];
    				else
    					p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j];
    			}
    		}
    	}
    	//计算二维数组最大子数组的和
    	int temp;
    	int max=a[0][0];
    	int sum;
    	//如果m==1
    	if(m==1)
    	{
    		for(i=0;i<n;i++)
    		{
    			for(j=i;j<n;j++)
    			{
    				if(i==0)
    				{
    					temp=p[j][m-1];
    				}
    				else
    				{
    					temp=p[j][m-1]-p[i-1][m-1];
    				}
    				if(sum<temp)
    					sum=temp;
    			}
    		}
    	}
    	else
    	{
    		for(i=0;i<n;i++)
    		{
    			for(j=i;j<n;j++)
    			{
    				if(i==0)
    				{
    					temp=p[j][m-1]-p[j][m-2];
    				}
    				else
    				{
    					temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2];
    				}
    				for(int k=m-2;k>=0;k--)
    				{
    					if(temp<0)
    						temp=0;
    					if(i==0)
    					{
    						if(k==0)
    							temp+=p[j][k];
    						else
    							temp+=p[j][k]-p[j][k-1];
    					}
    					else
    					{
    						if(k==0)
    							temp+=p[j][k]-p[i-1][k];
    						else
    							temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
    					}
    					if(sum<temp)
    						sum=temp;
    				}
    			}
    		}
    	}
    	return sum;
    }
    
    int main()
    {
    	int n,m;
    	cout<<"请输入二维数组的行数:"<<endl;
    	cin>>n;
    	cout<<"请输入二维数组的列数"<<endl;
    	cin>>m;
    	int i,j;
    	int **a=new int*[n];
    	cout<<"请输入该二维数组元素:"<<endl;
    	for(i=0;i<n;i++)
    	{
    		a[i]=new int[m];
    		
    		for(j=0;j<m;j++)
    		{
    			cin>>a[i][j];
    		}
    	}
    	int sum=maxSubArray(a,n,m);
    	cout<<"二维数组的最大子数组之和:"<<sum<<endl;
    	return 0;
    }
    

    四、测试及实验截图

    有正有负时测试正确:

    全正数时正确:

    有正有负有零:

    全负数时:

    五、缺陷及总结:

    本次结对我两在上次用动态法一维数组求最大子数组之和基础上,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和即可,缺陷就是这样时间复杂度比较大,程序也没有相应的错误输入提示,有待改进。

    六、工作合照:

     

  • 相关阅读:
    Win8.1恢复被禁用虚拟WiFi适配器的方法
    VM虚拟机安装AndroidX86版
    (转)java 调用webservice的各种方法总结
    在虚拟机中配置FastDFS+Nginx模块
    Nodejs&express+mongodb完成简单用户登录(即Nodejs入门)
    C# WPF 自学 MVVM简单介绍
    【ASP.NET Core】在CentOS上安装.NET Core运行时、部署到CentOS
    log4net 写入 mongodb+Mongodb记录日志
    MongoDB学习笔记
    使用druid 数据池对连接密码加密
  • 原文地址:https://www.cnblogs.com/2015tan/p/4361116.html
Copyright © 2020-2023  润新知