最大子数组二

一、实验思路:
1.定义一个整型数组num[n],随机生成数组中元素的值
2.把这个整形数组连成环,就是把这个数组中的每一个元素都当一次头,邻接的左元素做尾,遍历一次数组,找出每一个元数组的子数组最大和,存放在max_a[]中
3.定义一个二维数组dpo[n][2],dpo[i][0]不包含num[i]子数组之和最大值,dpo[i][1]包含num[i]子数组之和最大值
4.采用循环递归的方式,调用max函数计算dpo[i][0],dpo[i][1],计算包含数组元素本身和不包含本身的前子数组最大和的情况,循环递归求出max_a[j],定义数组arr[i][j]用来存放最大和子数组,通过比较
dpo[i][0],dpo[i][1]最大子数组中的元素,存放在arr[i][j]中,j表示子数组的位置
5.比较max_a[]中元素的最大值,找出最大和赋给Max,同时返回元素的位置,就是最大和数组的位置,救是arr[i][j]在哪个元数组中
6.通过条件比较过滤到arr[i][j]中空元素,并将其倒序存放arr_1[]中,然后将arr_1[]倒序输出,救是最大子数组。

 1 #include<iostream>
 2 #include<string>
 3 #include<time.h>
 4 #define N 1000
 5 using namespace std;
 6 int main()
 7 {
 8     srand((unsigned)time(NULL));
 9     int num[N],dpo[N][2];
10     int n;
11     cout<<"请输入数组的长度:"<<endl;
12     cin>>n;
13     cout<<"这个数组为:"<<endl;
14     for(int i=0;i<n;i++)
15     {
16         num[i]=-5+rand()%15;
17         if(num[i]==0)
18         {
19             num[i]=1+rand()%15;
20         }
21         cout<<num[i]<<" ";
22     }
23     cout<<endl;
24     cout<<"最大和子数组为:"<<endl;
25     int front,Max=-300,arr[100][100],max_a[N];//front是指数值环中的每一个元素都可以当头,Max指输出的最大值,max_a用来存放每个元数组的最大值
26     for(int j=0;j<n;j++)
27     {
28         front=num[0];
29         for(int i=1;i<n;i++)
30         {
31             num[i-1]=num[i];
32         }
33         num[n-1]=front;               //在数组环中让每一个元素当头,左边的元素当尾,遍历元数组
34         dpo[0][0]=0;
35         dpo[0][1]=num[0];
36         for(int i=0;i<n;i++)          //找出每一个元数组的子数组最大和,存放在max_a[]中
37        {
38             dpo[i][0]=max(dpo[i-1][0],dpo[i-1][1]);
39             dpo[i][1]=max(dpo[i-1][1]+num[i],num[i]);
40             max_a[j]=max(dpo[i][0],dpo[i][1]);
41             if(dpo[i][0]<=dpo[i][1])      //找每一个元数组的最大和子数组,采用循环比较的方法
42             {
43                 if(num[0]<0)
44                 {
45                     arr[0][j]=NULL;
46                 }
47                 arr[i][j]=num[i];
48             }
49             if(dpo[i][0]>dpo[i][1])
50             {
51                 if((dpo[i][1]==dpo[i-1][1]+num[i])&&(dpo[i][1]>0))
52                 {
53                     arr[i][j]=num[i];
54                 }
55                 else
56                 arr[i][j]=NULL;
57             }
58         }
59     }
60     int p=n-1,arr_1[N],m=0,k,j;     //arr[]用来存放最大子数组
61     for(int i=0;i<n;i++)            //比较每一个元数组的最大子数组的和,把最大的和赋给Max,
62     {
63         if(max_a[i]>Max)
64         {
65             Max=max_a[i];
66             j=i;                  //找出最大和所在的元数组
67         }
68     }
69     while(p>=0)                   //把最大和的子数组过滤出倒序存放在arr_1[]中
70     {
71         if(arr[p][j]==NULL)
72         {
73             p--;
74         }
75         if(arr[p][j]!=NULL)
76         {
77             while((arr[p][j]!=NULL)&&(p>=0))
78             {
79                 arr_1[m]=arr[p][j];
80                 m++;
81                 k=m;
82                 p--;
83             }
84             p=-1;
85         }
86     }
87     for(int i=k-1;i>=0;i--)      //输出最大和子数组
88     {
89         cout<<arr_1[i]<<" ";
90     }
91     cout<<endl;
92     cout<<"最大数组和为:"<<endl;
93     cout<<Max<<endl;
94 }

二、实验截图:

三、实验日志:

项目记录 日志:


听课


编写程序


阅读相关书籍


网上查找资料


日总计


周一


2


0


0


0


2


周二


0


1


1


0


2


周三


0


3


0.5


1


4.5


周四


2


0.5


0.5


0


3


周五


0


3


0.5


1


4.5


周六


0


1


0


1


2


周日


0


3


1


0


4


周总计


4


12.5


3.5


3


22

时间记录日志


日期


开始 时间


结束时间


中断时间


净时间


活动


备注


星期一


14:00


16:00


10


100


上课


软件工程


星期二


16:00


17:00


0


60


编程


数组问题


19:00


20:00


0


60


阅读书籍


构建之法


星期三


13:00


17:00


60


180


编程


19:00


21:00


30


90


阅读书籍


构建之法


星期四


14:00


16:00


10


100


上课


软件工程


19:00


20:00


0


60


编程 查找资料


数组问题


星期五


13:00


17:00


60


180


编程


数组问题


17:00


18:00


0


60


上网


查资料


星期六


12:00


14:00


30


90


编程


数组问题


星期日


9:00


11:00


0


180


编程


数组问题二

缺陷记录日志:


日期


编号


类型


引入阶段


排除阶段


修复阶段


修复缺陷


3/27


1


数组变环阶段


30min


在数组连接成环时,让数组中的每一个元素都当一次头,循环遍历一次


2


最大和子数组的返回


3h


在编写这一步骤时遇到困难,我返回的方法比较笨拙,在遍历最大和的时候,做出最大和子数组所在的元数组,在元数组循环遍历求最大和时,通过比较dpo[i][0],dpo[i][1]的大小,来找出最大子数组

四、实验总结:

在这次实验中,我们遇到了两个难题,一是如何将数组连成环,二是如何返回最大和数组的值,这两个问题我们讨论了很久,虽然思路还是不太简单,但是还是解出来了,我觉得结对开发在我们做项目时效率要提高很多,一个人的能力毕竟是有限的,两个人相互合作,相互补充,才能在更短的时间内,更高效率的而完成工作。

我的伙伴 鲁鑫:http://www.cnblogs.com/LUXIN123/

时间: 2024-10-23 09:30:58

最大子数组二的相关文章

求最大子数组二(结对开发)

结对伙伴: 纪烈翔 博客名:我们都是小怪兽 链接:http://www.cnblogs.com/qwer113/ 设计思想: 1:随机输入一个数组 2:用直接穷举法求出该数组的最大和(把数组看成环形) 3:定义一个结构体,求出最大数组时,记录该数组的开始和结束的位置 4:输出 程序源代码: //动态规划 //2016/3/26 #include "iostream" using namespace std; #define N 100 typedef struct data//定义结构

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

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

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

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

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

题目:返回一个二维整数数组中最大子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 借鉴网上代码整理得思路: 根据一位数组最大子数组求和的编程思路,讲二维数组转化成一维数组求解: 即求出每一行的最大子数组之和,通过比较各行最大子数组之和的大小,求出只有二维数组只有一行的情况下的最大子数组之和: 然后求每两行最大子数组之和,即将每两行的相同列相加,将二维数

二维数组求最大子数组

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

《团队开发项目之三二维数组的最大子数组之和》

设计思想:按列或按行的次序依次进行计算每个以列或行的次序为基准的每种情况下的每个子矩阵的和,然后再依次进行比较每个子矩阵的和,取出最大的一个即是最大字数组之和: 源代码: //二维数组的最大子数组之和 //李敏,Apr 8th #include<iostream> #include<time.h> using namespace std; void main() { int m,n,a[100][100],k,t,c,i,j,z; int maxsum,sum[100],max=0

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

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.源代码 #include<iostream.h> int main() {  int x,y,n,m;  int s[10][20];  int sum[10][20]; cout<<"请输入3行4列的矩

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

一.题目: 返回一个二维整数数组中最大子数组的和.二.要求:    输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 三.成员 编写程序者:岳竞一 协同者:付东 四.编程思路 首先,根据一维数组原理,可以先求出每个行数组的最大子数组和. 然后,将二维3行数组分写成5行子数组的数组,3,4行为1,2和2,3行一起的子数组,5行为,1,2,3行的

求二维数组最大子数组

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