结对开发之返回一个二维整数数组中最大联通子数组的和

一、题目要求

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

二、解题思路

先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果。

三、程序代码

  2 #include<iostream.h>
  3 int main(int argc, char* argv[])
  4 {
  5     int i,j;
  6     int a[3][5]={{1,-2,3},{1,-3,2},{4,-4,5}};
  7     int b[3][5];
  8     for(i=0;i<3;i++)
  9     {
 10      for(j=0;j<2;j++)
 11         a[i][j+3]=a[i][j];
 12     }
 13     int max=a[0][0];
 14     cout<<"初始二维数组为:"<<endl;
 15     for(i=0;i<3;i++)
 16     {
 17         for(j=0;j<3;j++)
 18         {
 19             cout<<a[i][j]<<‘ ‘;
 20         }
 21         cout<<endl;
 22     }
 23     cout<<"重构后环形数组为:"<<endl;
 24     for(i=0;i<3;i++)
 25     {
 26         for(j=0;j<5;j++)
 27         {
 28             cout<<a[i][j]<<‘ ‘;
 29         }
 30         cout<<endl;
 31     }
 32
 33
 34     for(i=0;i<1;i++)
 35     {
 36         b[0][0]=a[0][0];
 37         for(j=0;j<5;j++)
 38         {
 39             if(a[0][j-1]<0)
 40             {
 41                 b[0][j]=a[0][j];
 42             }
 43             else
 44             {
 45                 b[0][j]=b[0][j-1]+a[0][j];
 46             }
 47         }
 48     }
 49     for(i=1;i<3;i++)
 50     {
 51         for(j=0;j<1;j++)
 52         {
 53             if(a[i-1][0]<0)
 54             {
 55                 b[i][0]=a[i][0];
 56             }
 57             else
 58             {
 59                 b[i][0]=b[i-1][0]+a[i][0];
 60             }
 61         }
 62     }
 63     for(i=1;i<3;i++)
 64     {
 65         for(j=1;j<5;j++)
 66         {
 67             if(b[i-1][j-1]<0)
 68             {
 69                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
 70                 {
 71                     if(b[i][j-1]>=b[i-1][j])
 72                     {
 73                         b[i][j]=b[i][j-1]+a[i][j];
 74                     }
 75                     else
 76                     {
 77                         b[i][j]=b[i-1][j]+a[i][j];
 78                     }
 79                 }
 80                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
 81                 {
 82                     b[i][j]=b[i-1][j]+a[i][j];
 83                 }
 84                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
 85                 {
 86                     b[i][j]=b[i][j-1]+a[i][j];
 87                 }
 88                 else
 89                 {
 90                     b[i][j]=a[i][j];
 91                 }
 92             }
 93             else
 94             {
 95                 if(b[i-1][j]>=0&&b[i][j-1]>=0)
 96                 {
 97                     b[i][j]=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
 98                 }
 99                 else if(b[i-1][j]>=0&&b[i][j-1]<=0)
100                 {
101                     b[i][j]=a[i][j]+b[i-1][j]-b[i-1][j-1];
102                 }
103                 else if(b[i-1][j]<=0&&b[i][j-1]>=0)
104                 {
105                     b[i][j]=a[i][j]+b[i][j-1]-b[i-1][j-1];
106                 }
107                 else
108                 {
109                     b[i][j]=a[i][j];
110                 }
111             }
112         }
113     }
114     cout<<"子矩阵的和数组为:"<<endl;
115     for(i=0;i<3;i++)
116     {
117         for(j=0;j<5;j++)
118         {
119             cout<<b[i][j]<<" ";
120         }
121         cout<<endl;
122     }
123     cout<<endl;
124     for(i=0;i<3;i++)
125     {
126         for(j=0;j<5;j++)
127         {
128             if(b[i][j]>max)
129                 max=b[i][j];
130         }
131     }
132     cout<<"最大子矩阵和为:"<<max<<endl;
133     return 0;
134
135 }

四、运行截图

五、实验总结

求二维数组最大子矩阵的和,求环形一维数组的最大子数组的和,环形一维时,我们采用了跨越首尾和不跨越首尾两种情况,发现这种方法不适用于二维,所以采用了重构数组的方法,转化成非环形,然后求二维最大子数组的和。开始在循环条件那儿遇到了问题,后来我们两个一起解决了,这次合作让我体会到了搭档的重要性,总之,这次结对开发很成功,以后继续努力。

时间: 2024-12-20 18:40:59

结对开发之返回一个二维整数数组中最大联通子数组的和的相关文章

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个二维整数数组中最大联通子数组的和(思路)

返回一个二维整数数组中最大联通子数组的和 题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: (方法一)首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. (方

返回一个二维整数数组中最大联通子数组的和

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 思想: 在看到本题目后,想了很久也没有想到比较满意的解决方法,觉得题目比较难,超出了我的能力范围.不过,个人认为可能用到了图论的知识,但是学的不好.根据上图给定的二维数组求解最大联通数组也许比较简单.以一个非负

《返回一个二维整数数组中最大联通子数组的和》

设计思想:(1)首先把这个二维数组按行的数目分解为与列数目具有相同数目的一维数组: (2)再分别求出这几个一维数组的最大连续子数组之和,分别记录每一个最大连续数组的首末位置: (3)接着分别比较看这几个一维数组的首末位置是否处于矩阵上相连的位置,找出位置上相连且之和为最大的数组,输出它们的和即可. 源代码: #include<iostream> using namespace std; int Max(int n,int a[],int *smark,int *mmark) { int b[1

返回一个二维整数数组的最大联通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求:输入一个二维整形数组,数组里有正数也有负数.求所有子数组的和的最大值. 一.设计思想 先求出这个这个数组中的最大值,并定位,然后找出这个值周围的4个数,联通这4个数中的正数,若全为负数,则查找次大值,并与最大值联通,判断联通前与联通后值得大小,若变小则不联通最大值,若变大则联通最大值,以此类推,直到最大联通子数组怎么联通都比原来的值小.

求二维整数数组中最大联通子数组的和

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 1 #include<i

结对开发之《返回一个二维整数数组中最大子数组的和》

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划.发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月9日24:00) 二.编程思路 我们的思路比较简单,采用的是将

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

题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.      二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和.      求所有子数组的和的最大值.要求时间复杂度为O(n). 结对编程要求:两人结对完成编程任务.              一人主要负责程序分析,代码编程.              一人负责代码复审和代码测试计划.              发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照)

《返回一个二维整数数组中最大子数组的和》

一.题目要求 题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 两人结对完成编程任务.一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照).(截止到周四4月21日24:00) 二.设计思路 本次实验设计思路非常简单,就