返回一个二维整数数组中的最大子数组之和(环)

要求:

输入一个二维整形数组,数组里有正数也有负数。

二维数组首尾相接,象个一条首尾相接带子一样。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

求所有子数组的和的最大值。

思路:

根据前几次所做的关于一维及二维数组的思路,将其整合。

把二维数组转换成一维数组,再用求一维数组最大子数组和(环)的方式求解

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<ctime>
 4 using namespace std;
 5 #define M 4
 6 #define N 4
 7 #include <memory.h>
 8
 9 int maxSubArray(int *arr, int size)       //最大子序列和
10 {
11     int i, sum, max1, max2, dp, min;
12     dp = max1 = arr[0];
13     for (i = 1; i < size; ++i)//非环形数组;++i,先i自加1,再使用i的值
14     {
15         if (dp < 0)
16             dp = arr[i];
17         else
18             dp += arr[i];
19         if (dp > max1)
20             max1 = dp;
21     }
22     sum = min = dp = arr[0];
23     for (i = 1; i < size; ++i)//求数组最小子数组和,再用数组全部元素和减去,则结果跨过arr[n-1]到arr[0]
24     {
25         if (dp>0)
26             dp = arr[i];
27         else
28             dp += arr[i];
29         if (dp < min)
30             min = dp;
31         sum += arr[i];
32     }
33     max2 = sum - min;//数组全部元素和减去最小子数组
34     return max1>max2 ? max1 : max2;//三目运算符;如果max1>max2,将max1的值返回,否则返回max2
35 }
36 int maxSubMatrix(int n, int m, int array[M][N])
37 {
38     int i, j, h, max, sum = -100000;
39     int b[100];
40     for (i = 0; i<n; i++)
41     {
42         memset(b, 0, sizeof(b));       //初始化b[]
43         for (j = i; j<n; j++)          //把第i行到第j行相加,对每一次相加求出最大值
44         {
45             for (h = 0; h<m; h++)
46             {
47                 b[h] += array[j][h];   //二维数组压缩成一维数组,然后求最大子序列和
48             }
49             max = maxSubArray(b, h);
50
51             if (max>sum)
52                 sum = max;
53         }
54     }
55     return sum;
56 }
57 int main()
58 {
59     int arr[M][N];
60     cout << "随机二维数组为:" << endl;
61     srand(time(0));
62     for (int i = 0; i < M; i++)
63     {
64         for (int j = 0; j < N; j++)
65         {
66             arr[i][j] = rand() % 50 - 25;
67             cout << arr[i][j] << " ";
68         }
69         cout << endl;
70     }
71     cout <<"最大子数组的和:"<< maxSubMatrix(M, N, arr) << endl;
72     return 0;
73 }

总结:每次编程结束后都应当将自己的程序保存下来,方便复用,同时,也可以看出,将程序分模块实现的好处。

时间: 2024-10-09 22:11:41

返回一个二维整数数组中的最大子数组之和(环)的相关文章

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的3*6的数据 我们决定设计一个3*6行的二维数组进行计算,依次进行比较 将最大子数组的和返回 代码 1 #include <iostream.h> 2 int main() 3 { 4 int a[3][6];//定义一个3*6的二维数组 5 int max; 6 int s;//求和 7 int count; 8 int b[3][7]; 9 cout<<"请输入二维数组(3*6)中的元素:"

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

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

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

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

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

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

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

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

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

题目:返回一个二维整数数组中最大子数组的和2 要求:输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 代码: 截图: 总结:

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

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

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

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

返回一个二维整数数组中最大子数组的和(圆柱形)

题目: 返回一个二维整数数组中最大子数组的和 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 组员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路: 本次的任务是二维数组的环状求最大子数组,结合前两次的开发经验我们把一维数组环状的思路继续在二维数组中使用,首先输入数组时令数组的列扩大一倍,也就是令数组后的数组长度的值与前边的数

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

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