结对开发(求二维首尾相接数组的最大子数组和)

一、题目要求

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

一、设计思想
  求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和
我们有一个最初的二维数组a[n][n]找它的 最大子数组之和
  1.我们先建立一个新的二维数组b[n][2*n-1],

2,这个新的二维数组就是将初始的二维数组首尾相连,例如

数组a[0][0] a[0][1]首尾相连后变为a[0][0] a[0][1] a[0][0]

a[1][0] a[1][1]                     a[1][0] a[1][1] a[1][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<iostream.h>

#include<conio.h>

int main()

{

int i,j;

int a[3][3];

int b[3][5];

int jixu;

cout<<"本程序解决3*3矩阵的首尾相连求最大子矩阵和的问题"<<endl;

cout<<"请输入3*3矩阵的各个数值"<<endl;

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

{

cin>>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;

}

for(i=0;i<3;i++)

{

for(j=0;j<3;j++)

{

b[i][j]=a[i][j];

b[i][j+3]=a[i][j];

}

}

cout<<"首尾相连后的数组为:"<<endl;

for(i=0;i<3;i++)

{

for(j=0;j<5;j++)

{

cout<<b[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+1<<endl;

cout<<"是否要继续此过程(jixu)1,继续 0,退出"<<endl;

cin>>jixu;

if(jixu==1)

{

cout<<endl;

main();

}

else

{

return 0;

}

getch();

return 0;

}

总结:这次我和小伙伴互换了角色,我负责敲代码,小伙伴负责代码审查,因为有了前几次结对开发的经验,这次任务进行的比较顺利。在上一次求二维数组子数组和的最大值时,查阅了很多资料,因此思路比较宽阔,在上一次大代码上经过简略的修改,就完成了这次的任务。通过互换角色,也发现了以往掩饰的不足,看到了对方的长处。希望以后能够合作更加愉快。

时间: 2024-10-10 14:45:47

结对开发(求二维首尾相接数组的最大子数组和)的相关文章

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

一.题目要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.解决思路: 由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果.

3月31号周二课堂练习:结对开发----求二维数组组成的矩阵中子矩阵的最大值二

一.题目要求 1.1输入一个二维整形数组,数组里有正数也有负数. 1.2二维数组首尾相接,象个一条首尾相接带子一样. 1.3数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.4求所有子数组的和的最大值.要求时间复杂度为O(n). 二.结对要求 2.1两人结对完成编程任务. 2.2一人主要负责程序分析,代码编程. 2.3一人负责代码复审和代码测试计划. 2.4发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三.设计过程 上次已经算过二维数组中

结对开发之二维环数组求最大子数组的和4

结对成员:信1201-1班    黄亚萍 信1201-1班    袁亚姣 一.题目要求 要求:            输入一个二维整形数组,数组里有正数也有负数.            二维数组首尾相接,象个一条首尾相接带子一样.            数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.            求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.设计思路 类似于3,将二维数组转化为一维数组来求最大子数组

结对开发Ⅵ——循环二维数组求和最大的子数组

一.题目及要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数.    二维数组首尾相接,象个一条首尾相接带子一样.     数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.  求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 (1)二维数组我们采用的还是数组的形式: (2)读取nxm的二维数组,储存成nx2m,把前m列重复加在二维数组的最后: (3)搜索最大数组的方法和不循环的二维数组是一样的,就是再加上判断条

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

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 1 #include "stdafx.h" 2 #include<i

结对开发-求环状二维数组最大子数组

结对成员:信1201-1班    黄亚萍 信1201-1班    袁亚姣 一.题目要求 要求:            输入一个二维整形数组,数组里有正数也有负数.            二维数组首尾相接,象个一条首尾相接带子一样.            数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.            求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.设计思路 类似于3,将二维数组转化为一维数组来求最大子数组

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

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 先调用以前求二维最大连续子数组之和的maxSubArray函数求一个首尾不相邻的二维最大连续子数组之和,接着用将第k列各元素左移一列可以再求一个最大连续子数组之和 ,循环m次(因为原二维数组有m列)求得每个

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

结对编程之求二维数组最大子数组和

1.题目: 返回一个二维整数数组中最大子数组的和. 2.要求: 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 3.设计思路: 分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵.比较其中最大的子矩阵值,找出最大的. 4.源代码: 1 #include<iostream> 2 using nam