最大子数组的和首尾相接(3)

#include<iostream>

using namespace std;

#define Nu 5

int main()

{

int a[Nu]={1,2,3,-1,4};

cout<<"随机产生数组为:";

for(int i=0;i<Nu;i++)

cout<<a[i]<<"  ";

cout<<endl;

int sum=a[0],b=a[0],x=0,y=0;

int    j=1;

while((j-x<Nu)&&x<Nu)

{

if(b>=0)

{

b=a[j%Nu];

if(j<Nu)

x=j;

else

break;

}

else

b+=a[j%Nu];

if(sum>=b)

{ sum=b;y=j;}

j++;

}

sum=0;

for(int i=y+1;i<x+Nu;i++)

sum+=a[i%Nu];

int z=y%Nu;

if(x>z)

{

j=1;sum=a[0];b=a[0];x=0;y=0;

while(j<Nu)

{

if(b<0)

{ b=a[j%Nu];x=j;}

else

b+=a[j%Nu];

if(sum<=b)

{ sum=b;y=j;}

j++;

}

cout<<x<<endl<<y<<endl;

cout<<"相应子数组为:";

for(int i=x;i<=y;i++)

cout<<a[i]<<" ";

cout<<endl;

}

else

{

cout<<x<<endl<<y<<endl;

cout<<"相应子数组为:";

for(int i=y+1;i<x+Nu;i++)

cout<<a[i%Nu]<<" ";

cout<<endl;

}

cout<<"相邻子数组最大和为:"<<sum<<endl;

return 0;

}

设计思路:介于第一次与第二次都有类似的问题,于是将两次的代码结合,互相弥补。

后感:本来觉得很简单,后来测试发现问题很多,这个可能还有错,继续努力吧

时间: 2024-08-07 21:19:40

最大子数组的和首尾相接(3)的相关文章

数组2--数组首尾相接,求最大子数组

结对开发我的队友王春帆,学号20132902博客地址 http://www.cnblogs.com/-beauTiFul/ 设计思路: 输入数组 1 -4 -2 7 a[0]=sz[0];1 a[1]=max(a[0]+sz[1],sz[1]);-3 a[2]=max(a[1]+sz[2],sz[2]);-2 a[3]=max(a[2]+sz[3],sz[3]);7 max(a[0],a[1]...a[n]) 同样要用到数组1的思想,由于可以首尾相连,就转换成分别求{1,-4,-2,7}{-4,

数组中子数组之和最大值(首尾相接)

题目:求一维子数组的最大子数组之和(一维数组首尾相接)并写出子数组 人员: 陈晨:程序复查,结果测试. 王颖瑞:编写代码 思路: 1.求最大子数组之和:对于首尾相接的数组来说,如果计算子数组之和,最多把数组循环两遍,所以我们把数组的长度扩大了一倍(如果要算的数组是5位,那么数组就定义为10位,前半部分和后半部分一样),之后把这个数组进行分组(以要算的数组为5为例).第一个数到第五个数为一组,第二个数与第六个数为一组...第五个数到第九个数.分别把各组的子数组的最大值记录到另一个数组中.比较求出最

首尾相连一维数组最大子数组(一)

一.题目 返回一个整数数组中最大子数组的和 二.要求 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 三.代码 #include <iostream> #define N 1000 using namespace std; int mai

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

题目: 随机出一个一维数组,设该数组为循环数组,求其最大小子数组. 一.设计思路 求最大子数组,就求出最大的连续正子数组. 将数组分为全负和有非负值两种情况.全负求出最大值即可. 在有非负值的情况下,先判断该随机数组的首尾是否相连,即首尾是否都大于等于零.如果首尾相连,则将该一维数组分为首.中.尾三部分,先求出首尾和S1,再求中间最大连续正子数组和S,令S1和S与maxS相比较,求出最大子数组:如果首尾不相连,则直接借鉴前一种情况中部的算法,求最大正子数组S. 二.源代码 1 //刘双渤,刘洪阳

体验结对开发的乐趣(5)--(首尾相连的二维数组求最大子数组和的问题)

结对伙伴:信1201-2班高扬.信1201-1班韩雪东 一.题目要求与设计思想 题目要求:在上一次的基础上把数组变为二维数组,然后首尾相接,形成连环,然后求和最大的子数组: 设计思想:一维数组首尾相连的问题已经得到解决,二位数组求和最大的子数组的问题也已经解决了,就是把这两个程序思想融在一起,然后在短短的时间内就完成了这次课堂项目. 二.源代码 1 // erweishuzuqiuzuida.cpp : Defines the entry point for the console applic

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

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

最大子数组的求解(包括首尾相接成环)

设计思想:首先先实现一个数组最大子数组的求法,主要用到的思想是从起始开始,当加到某一个地方和为负数的时候,那么最大子数组在这个数前面或者后面(截止到a[i]和为负,那么最大子数组存在于a[0]到a[i-1]或者a[i+1]到a[n-1]),然后实现首尾连接的环的情况,可以直接定义一个二倍长度的数组,存两遍数据,在分别从b[0]到b[n-1]中寻找n个数据的最大子数组,最后返回最大的即可. 出现的问题,解决的方案:在起初实现最大子数组的求解时,需要注意因为给予的起始值为0,所以当数据全为负数的时候

结对开发(求二维首尾相接数组的最大子数组和)

一.题目要求 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 一.设计思想 求环形二维数组最大子数组的和,可以转化为求一维数组最大子数组的和 我们有一个最初的二维数组a[n][n]找它的 最大子数组之和 1.我们先建立一个新的二维数组b[n][2*n-1], 2,这个新的二维数组就是将初始的二

首尾相接的数组(环)-最大子数组

一 题目:一个首尾相接的一维整型数组,其中有正有负,求它的最大子数组并返回它的位置. 结对开发人员:朱少辉,侯涛亮 二 设计思路:设这个数组为a[n],那么扩大数组范围,使之为a[2*n],将a[0]~a[n-1]的值赋给a[n]-a[2*n-1],那么就相当于从第i个(i=0,1,2..n-1)到第i+n(不包含i+n)个中求最大的子数组,这时可以用到求一维数组(不是环)最大子数组动态规划的思想求解,每求得一个最大值进行比较,最后可求得最大子数组.至于求位置即最大子数组下标,可以附设一个指针j