环形二维数组求最大子矩阵

1.设计思路

结合环一位数组的开发经验,拓展到二维。与前者主要是时间复杂度没有做处理。

2.源代码

  1 //作者:王炳午、董龙洋。日期:2015.3.24.
  2 #include <iostream>
  3 #include<stdlib.h>
  4 #include<time.h>
  5 using namespace std;
  6 int maxMax(int amax[])     //求最大
  7 {
  8     int i;
  9     int sum = 0;
 10     int max;
 11     int max_max;
 12     max = 0;
 13     max_max = 0;
 14     for (i = 0; i < 9; i++)
 15     {
 16         max += amax[i];
 17         if (max < 0)
 18             max = 0;
 19         if (max != 0)
 20         {
 21             sum++;
 22             if (sum >= 5)
 23                 max = 0;
 24             if (max > max_max)
 25                 max_max = max;
 26         }
 27         else
 28         {
 29             sum = 0;
 30             if (sum >= 5)
 31                 max = 0;
 32             if (max > max_max)
 33                 max_max = max;
 34         }
 35     }
 36     if (max_max == 0)
 37     {
 38         for (int i = 0; i < 9; i++)
 39         {
 40             if (max_max == 0)
 41             {
 42                 max_max = amax[i];
 43             }
 44             else
 45             {
 46                 if (max_max < amax[i])
 47                 {
 48                     max_max = amax[i];
 49                 }
 50             }
 51         }
 52     }
 53     return max_max;
 54 }
 55
 56 int main()
 57 {
 58     int a[3][5];
 59     int b[3][9];      //合并后的数组;
 60     int i;
 61     int j;
 62     int sum = 0;
 63     int overmax;
 64     int max;
 65     int max_max;
 66     int bmax[100];
 67     int amax[100];
 68     cout << "---------------------求数组中子数组和的最大值的小程序----------------------" << endl;
 69     cout << endl;
 70     cout << "得到的二维随机整数数组(3行5列)如下:" << endl;
 71     srand((unsigned)time(NULL));//随机数种子为当前计算机时间。
 72
 73     for (i = 0; i < 3; i++)      //输入数组中的每个元素
 74         for (j = 0; j < 5; j++)
 75             a[i][j] = (rand() % 21 - 10);
 76     for (i = 0; i < 3; i++)
 77         for (j = 0; j < 9; j++)
 78         {
 79             if (j >= 0 && j <= 4)
 80                 b[i][j] = a[i][j];
 81             else
 82                 b[i][j] = a[i][j - 5];
 83         }
 84
 85     for (i = 0; i < 3; i++)        //每行数据比较;
 86     {
 87         max = 0;
 88         max_max = 0;
 89         for (j = 0; j < 9; j++)
 90         {
 91             max += b[i][j];
 92             if (max < 0)
 93                 max = 0;
 94             /*if (max != 0)
 95             {
 96             sum = 0;
 97             sum++;
 98             }
 99             if (sum >= 5)
100             max = 0;
101             if (max > max_max)
102             max_max = max;*/
103             if (max != 0)
104             {
105                 sum++;
106                 if (sum >= 5)
107                     max = 0;
108                 if (max > max_max)
109                     max_max = max;
110             }
111             else
112             {
113                 sum = 0;
114                 if (sum >= 5)
115                     max = 0;
116                 if (max > max_max)
117                     max_max = max;
118             }
119         }
120         if (max_max == 0)
121         {
122             max_max = b[0][0];
123             for (j = 0; j < 9; j++)
124             {
125                 if (max_max < b[i][j])
126                     max_max = b[i][j];
127             }
128         }
129         bmax[i] = max_max;           //0到2
130     }
131     for (j = 0; j < 9; j++)        //上中组合两两组合保存在amax数组
132     {
133
134         amax[j] = b[0][j] + b[1][j];
135
136     }
137     bmax[3] = maxMax(amax);
138
139     for (j = 0; j < 9; j++)        //中下组合两两组合保存在amax数组
140     {
141
142         amax[j] = b[1][j] + b[2][j];
143
144     }
145     bmax[4] = maxMax(amax);
146
147     for (j = 0; j < 9; j++)        //上中下组合两两组合保存在amax数组
148     {
149
150         amax[j] = b[1][j] + b[2][j] + b[0][j];
151
152     }
153     bmax[5] = maxMax(amax);
154
155
156
157
158
159     for (i = 0; i < 3; i++)     //输出数组中每个元素
160         for (j = 0; j < 5; j++)
161         {
162             cout << a[i][j] << "\t";
163             if ((j + 1) % 5 == 0)
164             {
165                 cout << endl;
166             }
167         }
168     //求二维数组子矩阵最大值。
169     overmax = bmax[0];
170     for (i = 0; i < 6; i++)
171     {
172         if (overmax < bmax[i])
173         {
174             overmax = bmax[i];
175         }
176     }
177     cout << "子矩阵和最大值为:" << overmax << endl;
178     /*    for(i=0;i<6;i++)
179     {
180     cout<<bmax[i]<<"\t";
181     }*/
182     return 0;
183 }3.运行结果

4.实验心得

本次开发过程主要有队友编写代码,我从旁协助。大家互换角色,锻炼了能力,有了结对开发的经验。

				
时间: 2025-01-02 15:55:35

环形二维数组求最大子矩阵的相关文章

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

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

二维数组求子数组之和最大值(首尾相接, 圆柱)

问题:求二维数组的子数组之和的最大值(首尾相接,即形成圆柱) 成员: 陈晨:负责代码复审和代码测试计划 王颖瑞:负责程序分析,代码编程 思路:对于这个问题,我们可以结合之前的实验(二维数组求子数组之和的最大值和首尾相连一维数组的子数组之和的最大值),把为二维数组的列扩大二倍,之后想一维数组(首尾相连)一样,把二维数组分成不同的几个二维数组.之后就分开求不同的二维数组的子数组的最大值,最后之间比较,求出总的最大值. 代码: #include<iostream> using namespace s

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

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

求一个二维数组的最大子矩阵的和

要求: • 输入一个二维整形数组,数组里有正数也有负数. • 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. • 求所有子数组的和的最大值. 设计思路: 使用“最笨方法”,考虑以每个数据开始的每个子矩阵.思路简单,效率极低. 实现语言:Java 源代码如下: /* * row,col分别为数组行数和列数 * source_row,source_col为子矩阵的起始位置 * edge_row,edge_col分别为行列边界 * */ public static int row =

二维数组求最大子数组和(环形)

一.实验题目 返回一个二维数组中最大子数组的和. 实验要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.实验思路 这次我们设计的实验是手动输入二维数组的行数和列数,二维数组的环形求和我们设计的思路和一位数组的类似,就是把求完的数组的第一列放到最后,依次类推.求最大的子数组和时和二维数组的求和类似,即:输入的二维数组是 -1 

环形二维数组

一.题目 输出二维环形数组中最大子数组和 二.设计思想 把解决一维环形数组,和普通二维数组的方法结合起来街是解决二维环形数组的方法. 三.源代码 #include<iostream.h> #include<time.h> #include<stdlib.h> int qiumax(int arry[],int max) { int i; long sum; for(i=0;i<5;i++) { for(i=0;i<5;i++) { arry[i+5]=arr

二维数组返回最大子矩阵之和

设计思路 将二维数组转化为一位数组(并非形式上的转化而是将连续的行合并然后当做上次编写的一维数组求最大子数组和)来计算.时间复杂度没有达到要求的O(n),也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于0则舍去这个子矩阵,按此方法计算从这个子矩阵以后的矩阵,知道遍历完取最大值. 代码: package soft_third_test; public class test { static int maxSum(int p[][],int startLine,int endLine,int

二维数组求最大子数组

设计思路: 首先定义产生二维数组,定义可输入二维数组行和列,各位数随机产生: 然后进行最大子数组的求和比较,从每行的第一个数为子数组的起点开始进行不同的子数组遍历比较,只存放最大的子数组,以及记录最大子数组的位置,从第一个数开始每行每列进行求和比较,以求得最大子数组的值,以及最大子数组所包含的数: 最后进行结果的输出与验证. 代码: 法一: package zishuzu; import java.util.*; public class zuixiaozishuzu { public stat

结对开发--四实现循环二维数组求最大子数组的和

一.实现思路 再上一个实验基础上加上环,我们实现环的思想是每一列依次向此替换,直至替换出能出现的所有的二维数组,再用上一个求最大子数组的方法全部实现 二.实验代码 package com.minirisoft; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Scanner; public class HuanTwoArray { public stat