循环二维数组最大子数组

 一、题目与要求

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

 二、设计思想

  通过上次求解简单一维回环数组的最大子数组问题的解决,我们采取的方法并不是时间复杂度为o(n)的算法。关于实现数组回环,我们的方法仍是定义一个二倍长数组来首尾存取两次待求数组,以此解决回环。

 三、源代码

  

  1 /*======================================================================
  2             # Author: TianYongTao && ZhangYaPeng
  3             # E-Mail: [email protected]
  4             # Last modified: 2015-04-01 10:14
  5             # Filename: Demo.cpp
  6             # Description: 求二维回环数组的最大子数组
  7 ======================================================================*/
  8 #include "stdafx.h"
  9 # include <iostream>
 10 # include <string>
 11 # define MaxRow 20
 12 # define MaxCol 20
 13 using namespace std;
 14 int Arr[MaxRow][MaxCol];
 15 int Array[MaxRow][2*MaxCol];
 16 int SumArr(int x1,int y1,int x2,int y2)                    //子数组求和
 17 {
 18     int sum=0;
 19     for(int i=x1;i<x2;i++)
 20     {
 21         for(int j=y1;j<y2;j++)
 22         {
 23             sum+=Array[i][j];
 24         }
 25     }
 26     return sum;
 27 }
 28
 29 void LoadFile(int Arr[][MaxCol],int & Row,int & Col)
 30 {
 31     FILE * infile = fopen("D:\\input.txt","r");
 32     int num[100];
 33     int count=0;
 34     if(!infile)
 35     {
 36         cout<<"文件读取失败!"<<endl;
 37         exit(-1);
 38     }
 39     else
 40     {
 41         char str[10];
 42         fscanf(infile,"%[^,]%*c",str);
 43         Row = atof(str);
 44         fscanf(infile,"%[^,]%*c",str);
 45         Col = atof(str);
 46         while(!feof(infile))
 47         {
 48             fscanf(infile,"%[^,]%*c",str);
 49             num[count++]=atof(str);
 50         }
 51     }
 52     for(int i=Row-1;i>=0;i--)
 53     {
 54         for(int j=Col-1;j>=0;j--)
 55         {
 56             Arr[i][j]=num[--count];
 57         }
 58     }
 59     for(int i=0;i<Row;i++)
 60     {
 61         for(int j=0;j<Col;j++)
 62         {
 63             Array[i][j] = Arr[i][j];
 64             Array[i][j+Col] = Arr[i][j];
 65         }
 66     }
 67 }
 68
 69 //测试函数
 70 int main()
 71 {
 72     int Row=0;
 73     int Col=0;
 74     LoadFile(Arr,Row,Col);
 75     for(int i=0;i<Row;i++)
 76     {
 77         for(int j=0;j<Col;j++)
 78         {
 79             cout<<Arr[i][j]<<"\t";
 80         }
 81         cout<<endl;
 82     }
 83     int x1,y1;                                //代表左上角点的横纵坐标
 84     int x2,y2;                                //代表右上角点的横纵坐标
 85     int flag1,flag2,flag3,flag4;        //(flag1,flag2)标识最大子数组的左上角坐标  (flag3,flag4)标识最大子数组的右下角坐标
 86     flag1=flag2=flag3=flag4=0;
 87     int max = Array[0][0];                //max存储比较过程中的最大值
 88     for(x1=0;x1<Row;x1++)
 89     {
 90         for(y1=0;y1<Col;y1++)
 91         {
 92             for(x2=x1+1;x2<=Row;x2++)
 93             {
 94                 for(y2=y1+1;y2<=2*Col;y2++)
 95                 {
 96                     if((y2-y1) > Col)
 97                     {
 98                         break;
 99                     }
100                     if(SumArr(x1,y1,x2,y2)>max)
101                     {
102                         max = SumArr(x1,y1,x2,y2);
103                         flag1=x1;
104                         flag2=y1;
105                         flag3=x2;
106                         flag4=y2;
107                     }
108                 }
109             }
110         }
111     }
112     cout<<"最大子数组为:"<<endl;
113     for(int i=flag1;i<flag3;i++)
114     {
115         for(int j=flag2;j<flag4;j++)
116         {
117             cout<<Array[i][j]<<"\t";
118         }
119         cout<<endl;
120     }
121     cout<<"该最大子数组的和为:"<<max<<endl;
122     return 0;
123 }

四、运行结果

    1.文件内容

    

  2.运行结果

    

五、结果测试

  1.全为正数

  

  2.全为负数

  

  3.有正有负

  

  六、心得体会

    该程序在实现的时候只是对上次的二维数组求最大子数组进行了小小的改动,具体实现方法没有多大的变动,唯一遗憾的是没有实现时间复杂度为o(n)。

    在结组开发的过程中,我和田永涛配合的越来越默契,能在一定程度上提高开发的效率。

  

时间: 2024-11-03 21:32:19

循环二维数组最大子数组的相关文章

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

 要求: 1,输入一个二维整形数组,数组里有正数也有负数. 2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和, 3,求所有子数组的和的最大值. 设计思路: 参照一维整数数组求解最大子数组的方法,我们想着将二维数组通过行不同,列相加的方法转化为一维整数数组再求解最大子数组之和. 具体实现:先求出每一行的最大子数组之和,之后比较得出最大和MaxSum,然后通过上述方法求二行的最大子数组之和并与MaxSum比较,用MaxSum存放较大值.以此类推,求三行,四行... 最后实现最大子数

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

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

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

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

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

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

首尾相连的二维数组最大子数组求和

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

编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

      首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了. 这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式: 以左上角的元素(1,1)和当前元素(i,j)为顶点对的子矩阵的部分和,部分和的计算如下 PS[i][j] = A[i][j]+PS[

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

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

求一维循环数组最大子数组

设计思路: 一维循环数组:一维整数组头跟尾相连形成一个环. 问题解决方案:将一个一维数组扩大两倍,求新的数组的最大子数组即可. import java.io.IOException; public class xunhuanshuzu { public static void main(String[] args)throws IOException{ int []a= {23,-12,234,-234,123,2,0,1,-1,-34}; int n=a.length; int []b=new

循环一维数组最大子数组

结对人员:张世通 梁世豪 一.题目 返回一维数组中最大子数组的和 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 要求时间复杂度为O(n) 二.设计思路 1.在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法 2.通过定义变量start,fin

求一维循环数组最大子数组的和

结对成员:信1201-1班 于海洋   袁佩佩 一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 二.设计思路 利用之前的返回一个整数数组最大子数组的和程序的思路,不过这里将数放到一个链表里,首尾相连,来求最大子数组的和. 三.源