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

结对成员:信1201-1班    黄亚萍

信1201-1班    袁亚姣

一、题目要求

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

二、设计思路

类似于3,将二维数组转化为一维数组来求最大子数组的和,并输出其最大子数组。

三、程序源代码

  1 #include <iostream>
  2 #include <fstream>
  3 using namespace std;
  4 # define M 100
  5 # define N 100
  6 int hang1=0;
  7 int hang2=0;
  8 int lie1=0;
  9 int lie2=0;
 10 int maxx = -100;
 11 int sum1(int k,int a[],int number)    //一维数组行数元素求和
 12 {
 13     int x=0;
 14     for(int i=k;i<=number+k-1;i++)    //数组元素的个数为number
 15     {
 16         x=x+a[i];
 17     }
 18     return x;
 19 }
 20 int sum2(int k,int a[M][N],int number,int num)   //二维数组列数元素求和
 21 {
 22     int x=0;
 23     for(int i=k;i<=number+k-1;i++)
 24     {
 25         x=x+a[i][num];
 26     }
 27     return x;
 28 }
 29 int Largest1(int list1[],int length)         //一维数组求数组的子数组的和的最大值
 30 {
 31     int sum[N];
 32     int i,j,max=-100;
 33     for(i=1;i<=length;i++)       //元素个数为i
 34     {
 35         for(j=1;j<=2*length-1-i+1;j++)   //子数组的第j个元素,求最大值
 36         {
 37              sum[j]=sum1(j,list1,i);
 38              if(sum[j]>=max)
 39             {
 40                 max=sum[j];
 41             }
 42         }
 43     }
 44     return max;
 45 }
 46
 47 void Largest3(int list[],int length)
 48 {
 49     int sum[N];
 50     int i,j;
 51     for(i=1;i<=length;i++)
 52     {
 53         for(j=1;j<=2*length-1-i+1;j++)
 54         {
 55             sum[j]=sum1(j,list,i);
 56             if(sum[j]>= maxx)
 57             {
 58                 maxx=sum[j];
 59                 lie1 = j;
 60                 lie2 = j+i-1;
 61             }
 62         }
 63     }
 64 }
 65
 66 int Largest2(int list[M][N],int number_x,int number_y)   //二维数组求数组的子数组的和的最大值
 67 {
 68     int max,m;
 69     int max2[N];
 70     int sum[M][N];
 71     int max3[N];
 72     for(int i=1;i<=number_x;i++)   //数组行数为i
 73     {
 74         cout<<"子数组行数为"<<i<<","<<endl;
 75
 76         for(m=1;m<=number_x-i+1;m++)    //子数组的第一行为原数组的第m行
 77         {
 78             cout<<"    第"<< m <<"行的最大值为:";
 79             for(int j=1;j<=2*number_y-1;j++)    //子数组第j列元素
 80             {
 81                 sum[i][j]=sum2(m,list,i,j);
 82             }
 83             Largest3(sum[i],number_y);
 84             max2[m]=Largest1(sum[i],number_y);    //数行数为i时子数组第m行的最大值
 85             cout<<max2[m]<<endl;
 86             max3[i]=max2[1];
 87             for(int k=1;k<=i;k++)
 88             {
 89                 if(max2[k]>=max3[i])
 90                 {
 91                     max3[i]=max2[k];
 92                     hang1=m;
 93                 }
 94             }
 95         }
 96     }
 97     max=max3[1];
 98     for(int n=1;n<=number_x;n++)
 99     {
100         if(max3[n]>=max)
101         {
102             max=max3[n];
103             hang1=m;
104             hang2=n;      //子数组的行数为第m行到第m+n行
105
106         }
107     }
108     return max;
109 }
110 void show(int arry[N][N],int length1,int length2)   //输出矩阵
111 {
112     for(int i=1;i<=length1;i++)
113     {
114         for(int j=1;j<=length2;j++)
115         {
116             cout<<arry[i][j]<<"\t";
117         }
118         cout<<endl;
119     }
120 }
121 int main(int argc, char* argv[])
122 {
123     int i,j,number_hang,number_lie;
124     int list[M][N],list1[M][N];
125
126     ifstream infile("input.txt");
127     if(!infile)
128         cout<<"读取失败!"<<endl;
129     else
130     {
131         infile>>number_hang>>number_lie;
132         for(int i=1;i<=number_hang;i++)
133         {
134             for(int j=1;j<=number_lie;j++)
135             {
136                 infile>>list[i][j];
137             }
138         }
139     }
140
141     cout<<"以矩阵形式展示为:"<<endl;
142     show(list,number_hang,number_lie);
143     cout<<endl;
144
145     cout<<"等价转换的数组为:"<<endl;
146     for(j=1;j<=number_hang;j++)
147     {
148         for( i=1;i<=2*number_lie-1;i++)
149         {
150             if(i<=number_lie)
151             {
152                 list1[j][i]=list[j][i];
153             }
154             else
155             {
156                 list1[j][i]=list[j][i-number_lie];
157             }
158             cout<<list1[j][i]<<" ";
159         }
160         cout<<endl;
161     }
162
163
164     cout<<"最大值为:"<<Largest2(list1,number_hang,number_lie)<<endl;
165     cout<<endl;
166     cout<<"对应的最大值的子数组为:"<<endl;
167
168     for(i=hang1-1;i<hang2+hang1-1;i++)
169     {
170         for(int j=lie1;j<=lie2;j++)
171         {
172             cout<<list1[i][j]<<"\t";
173         }
174         cout<<endl;
175     }
176     cout<<endl;
177     return 0;
178 }

四、运行结果截图

五、心得体会

在这个过程中,我在深深的我们的默契越来越好了,我们在一起讨论问题,整个问题也越来越复杂,但是在原来的基础上,感觉难度小了许多。

时间: 2024-10-27 08:10:57

结对开发-求环状二维数组最大子数组的相关文章

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

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

软件工程课堂训练——结对开发之环状二维数组

一.题目及要求: 题目:返回一个整数数组中最大子数组的和 要求(新加):①输入一个二维整形数组,数组里有正数也有负数:②二维数组首尾相接,像一条首尾相接的带子一样. 结对人员:胡亚宝  焦燕 二.设计思路: 这个题目其实就是二维数组和环型数组的结合,要解决这个问题,将之前的两个问题融合一下即可. 首先解决求出二维数组中最大子数组的问题,然后沿用一维数组的方法,将第一列放到最后一列,在求出新的二维数组的最大子数组,依次求出各个二维数组的最大子数组. 三.部分源代码: 1 for (m=0;m<5;

结对开发5_循环二维数组最大字数组

一.思想 我们这次的思想和一维数组的思想一样,但是考虑到是二维的,所以其算法和结对开发3的算法一样.即加长数组的列数 加以控制条件,最后求出最大子数组的和,并输出. 二.源代码 // 结对开发5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" # include <iostream> # include <string> # define MaxRow 20 # define MaxCol 20 using namespa

软件工程概论---环状二维数组最大子数组和

1,题目要求 根据软件工程概论--<环状一维数组最大子数组和>和<二维数组最大子数组和>两篇博客,求环状二维数组的和. 2,思路设计 根据前面两篇博客思路做参考.在二维数组的基础上扩充二维数组的列为2*col-1.再进行二维数组的求和即可. 3,代码 #include <iostream> #include<time.h> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define M

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

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

环状二维数组最大子数组求和

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

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

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

环状二维数组(改进版)

上一篇环状二维数组还存在问题,当时并未判断产生的子矩阵是否超过矩阵的范围,所以结果会出现问题. 改进版的程序中对此进行了判断. 此问题分为两种,一种是最大子数组成环,一种是最大子数组未成环.未成环的部分之前已实现,下面是成环部分. 开始的思路是:将矩阵进行扩大,类似于一维数组,但是扩大后就会出现子矩阵的范围有可能超出矩阵的范围.所以在此处要有一个判断. 改进后的程序 #include <iostream> #include<time.h> using namespace std;

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

要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. #include <iostream> using namespace std; #define M 1000 int A[M][M]; int AS[M][M]; inline int ArraySum(int s,int t,i