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

1.题目:

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

2.要求:

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

3.设计思路:

分别求出每一行的最大子矩阵,然后再两行相加,求出最大子矩阵,一直到所有的行相加,求出最大子矩阵。比较其中最大的子矩阵值,找出最大的。

4.源代码:

 1 #include<iostream>
 2 using namespace std;
 3 #include <ctime>
 4 #include <cstdlib>
 5 #define MAX 10000
 6 int Max(int b[])
 7 {
 8     int m[MAX],n=0,p=0;
 9     for(int i=0;i<4;i++)
10     {
11         for(int j=0;j<4;j++)
12         {
13             n=n+b[i+j];
14             m[p]=n;
15             p++;
16         }
17         n=0;
18     }
19     int max=m[0];
20     for(i=0;i<p;i++)
21     {
22         if(m[i]>max)
23             max=m[i];
24     }
25     return max;
26 }
27
28 int main()
29 {
30     int k[MAX],a[4][8],h[8];
31     srand(time(0));
32     cout<<"该矩阵为:"<<endl;
33     for(int i=0;i<4;i++)
34     {
35         for(int j=0;j<4;j++)
36         {
37             a[i][j]=rand()%100-50;
38             a[i][j+4]=a[i][j];
39             cout<<a[i][j]<<" ";
40         }
41         cout<<endl;
42     }
43     for(i=0;i<4;i++)
44     {
45         k[i]=Max(a[i]);
46     }
47     int  q=4;
48     for(i=0;i<3;i++)
49     {
50         int    t=0;
51         for(int j=0;j<8;j++)
52         {
53
54             h[t]=a[i][j]+a[i+1][j];
55             t++;
56         }
57         k[q]=Max(h);
58         q++;
59     }
60     for(i=0;i<2;i++)
61     {
62         int    t=0;
63         for(int j=0;j<8;j++)
64         {
65
66             h[t]=a[i][j]+a[i+1][j]+a[i+2][j];
67             t++;
68         }
69         k[q]=Max(h);
70         q++;
71     }
72     int t=0;
73     i=0;
74     for(int j=0;j<8;j++)
75     {
76
77         h[t]=a[i][j]+a[i+1][j]+a[i+2][j]+a[i+3][j];
78         t++;
79     }
80     k[q]=Max(h);
81     q++;
82     cout<<endl;
83     int max=k[0];
84     for(i=0;i<q;i++)
85     {
86         if(k[i]>max)
87             max=k[i];
88     }
89     cout<<"最大子矩阵的值为:"<<endl;
90     cout<<max;
91     return 0;
92 }

5.结果截图:

6.心得体会:

一次次的程序延伸,一次次的修改代码,让我们组对于子数组求和的理解更深了,但题目千变万化,我们还是要多多学习的,争取做到再难再复杂的变化也能攻破吧。

时间: 2024-08-14 03:26:16

结对编程之求二维数组最大子数组和的相关文章

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

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 一.设计思想 求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和 我们有一个最初的二维数组a[n][n]找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][2*n-1], 2,这个新的二维数组就是将初始的二

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

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

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

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

求二维数组最大子数组的和

结对开发成员:朱少辉,侯涛亮 朱少辉:负责程序分析,代码编程 侯涛亮:负责代码复审和代码测试 设计思路: 根据求一维子数组的最大子数组和的列子,把二维数组分解成若干个一维子数组,如m行n列的数组可分为(m+1)*m/2个子数组,在求每个一维数组的最大子数组和,把这些和放入一个数组中,求这个数组的最大值就是二维数组最大子数组的和.这种算法的时间复杂度为o(n^3). 代码: #include<iostream> using namespace std; void main() { int m,n

求二维数组中子数组和中最大的值,及子数组

求二维数组中子数组和中最大的值,及子数组 个人信息:就读于燕大本科软件工程专业 目前大三; 本人博客:google搜索"cqs_2012"即可; 个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献; 编程语言:C++ ; 编程坏境:Windows 7 专业版 x64; 编程工具:vs2008; 制图工具:office 2010 powerpoint; 硬件信息:7G-3 笔记本; 真言 每次着急写程序,碰到问题就头疼,头疼之后便是满满的收获,付出总有回报. 题目 求

编程题:二维数组的下标意义

#include<stdio.h> void main() { int i,j,a[2][3],b[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=i; for(i=0;i<2;i++) for(j=0;j<3;j++) b[i][j]=j; printf("array a:\n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%3d

结对编程之求首尾相连数组中最大子数组的和

1.题目: 返回一个整数数组中最大子数组的和. 2.要求: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.同时返回最大子数组的位置.求所有子数组的和的最大值.要求时间复杂度为O(n). 3.设计思想: 分情况讨论最大子数组可能出现的情况,第一种为正常情况,没有超过数组范围,第二种则比较复杂,要用到环的一部分元素,分而求出两

数组问题(三)求二维整型数组最大联通子数组的和

相较于上次求最大子矩阵的和,这次明显更难了一些. 将问题分解并分析,可以想到 先求各行中的最大子数组,并记录下标,求完之后再将各行的最大子数组的下标进行比较可以得到两种情况 1.上一行的最大子数组下标范围和下一行的最大子数组下标范围有重合的部分. 2.上一行的最大子数组下标范围和下一行的最大子数组下标范围无重合的部分. 程序代码: #include<iostream> using namespace std; int calculate(int n,int a[],int &sm,in

环形二维数组最大子数组的和

设计思路: 因为之前做过二维数组的和环形一维数组的,所以第一感觉就是能不能把这两种整改一下结合起来,所以采用的做法就是将二维环形变化为一维环形,在此采用的方法是从第一行开始,第一行计算出最大子数组,然后第一行和第二行相加为一维计算最大子数组,然后第一行.第二行和第三行,以此类推,最后将各子数组的最大值进行比较,得到最大的即为子数组和的最大值. 实验代码: //环形一维数组求最大子数组 package erwei; public class oneArray { private int i; pu