首尾相接最大子数组和

#include<iostream>
using namespace std;
#define Nu 5

int main()
{
    int a[Nu]={1,-2,5,-3,6};

    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];x=j;}
        else
            b+=a[j%Nu];
        if(sum<=b)
        { sum=b;y=j;}
        j++;
    } 

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

    cout<<"相应子数组为:";
    for(int i=x;i<=y;i++)
        cout<<a[i%Nu]<<" ";
    cout<<endl;

    return 0;
}

成员:宋雨佳  周雪莹

设计思路:根据上次做的一维数组最大子数组的和,只要将收尾完成对接就好了,即当加到数组的最后一个数时回到第一个数继续加,现在的问题就是怎样让他停下来!根据多次限制测试得知当首位置小于数组长且子数组长小于数组长即可得到最大子数组和。

后感:由于有上次做的一维数组最大子数组和的基础,就是在选择限制循环条件是浪费了些时间,老师一言点醒。

时间: 2024-11-05 13:45:20

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

首尾相接二维数组(圆柱)--求最大子矩阵

一 题目:一个首尾相接的二维数组,其中有有正数,有负数,求它的最大子矩阵. 二 设计思路: 这道题基本无难度,因为这道题可以参考以前做过的求解二维数组的子矩阵(不是首尾相接),所以可以简单划分为两部分.第一步先将它化为一维首尾相接的数组(环),然后再利用求解环中最大子数组的思想求解.具体将二维数组化为一维数组请参考(http://www.cnblogs.com/houtaoliang/p/4401630.html),在此只简单分析求解环的最大子数组. 求解环的最大子数组可分为两种情况.第一种:当

求最大子数组(循环数组)

一.设计思想: 通过一个for循环.数组分别从0-最大,1-最大-0 等等依次 到最大-最大-1,通过这样的方式达到循环数组的目的.然后在每一个的数字里面,从第一个数开始向后按顺序相加,当相加结果为负数的时候,则此时不满足构成最大子数组的条件,然后从导致数组为负数的数的下一个数开始向后相加.最后求得此情况下的最大子数组和.然后分别求出N个最大子数组的和,然后在进行比较大小,得出最终的最大子数组的和. 二.出现的问题: 起初并没有实现在一个首尾相接的数组中,最大子数组和为正确值,例如 1 -2 -

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

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (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

首尾相接整数数组中最大子数组的和

设计思路: 可以分为两种情况:一种不跨数组第一个数的,一种是跨过第一个数的,不跨第一个数的利用上次的算法进行计算,跨数组的求首尾相接子数组和的最大值,可以考虑反面最小值的情况,然后利用总和减去最小值就是最大值的情况,最小值的求法与最大值相同. 程序源代码: #include<iostream> using namespace std; #include<vector> int main() { int i,len; int max0=0,max1=0,sum=0,min=0,sum

数组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,

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

设计思想 遍历数组的时候将数组中第一个数变成最后一个数,这样就得到了好几个新的数组,然后输出每个数组的最大子数组的和,在比较每个输出结果,找到最大的子数组和. 代码 #include <iostream> #include<ctime> #define Num 10000 using namespace std; int DTGH_Sum(int a[],int n) { int sum = 0; int *b = (int *) malloc(n * sizeof(int));