循环数组的子数组最大和

Posted yzhztoutlook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环数组的子数组最大和相关的知识,希望对你有一定的参考价值。

一。实验要求

1.输入一个整型数组,数组里有正数也有负数,数组中一个或多个整数组成一个整数组,每个子数组都有一个和。

2.数组可以首位相连,允许A【i-1】,....,A[n-2],A[0]........A[j-1]和最大

3.返回最大子数组的位置,求最大子数组的和.

二、实验思路

循环数组,也就是最后一个数组值和第一个数组值相连,整个子数组可以从任何一个整数开始遍历求出所有的子数组,参考前面数组的设计思想,有二种可能的解决方案。

1.对数组内的每一个数都进行遍历,然后遍历以他们为起点,长度最大为数组长度的所有子数组,比较各个子数组的大小,求出最大子数组的和。

2.从头开始遍历,遍历到数组A【i】时,最大子数组的值可能是max+A【i】,也可能为A【i】,做出比较,取最大值.

我们选择了第一种解决方案,遍历所有的子数组求出最大值,因为是循环数组,所以从每一个数开始遍历其最长子数组的长度都是数组的长度,所以我们将数组通过if循环,赋值给长度为数组长度2n-1的新数组,设施遍历长度为n,遍历出所有子数组,求出最大值.

三。实验人员:

袁凤隆  杨子浩

四。实验源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int main()
{
    int i,d,m,a,h,l,p;
    int max=0;
    int b=0;
    int c [10];
    int n [19];
    srand(time(NULL));
    for(i=0;i<10;i++)
    {
        d=rand()%2;
        if(d==0)
        {
            c[i]=rand()%10;
        }
        else
        {
            c[i]=-rand()%10;
        }
 
        printf("%d  ",c[i]);
    }
    printf("   ");
    for(m=0;m<19;m++)
    {
        if(m<10)
        {
            n [m]=c [m];
        }
        else
        {
            n [m]=c [m-10];
        }
        printf("%d  ",n[m]);
    }
    for(m=0;m<10;m++)
    {
        for (i=m;i<(10+m);i++)
        {
            for(a=i;a<(10+i);a++)
            {
                d=0;
                for(h=i;h<=a;h++)
                {
                    d+=n[h];
                    if(d>max)
                    {
                    max=d;
                    l=i;
                    p=a;
                    }
                }
            }
        }
    }
        if(max==0)
        {
            max=c[0];
            for(i=0;i<10;i++)
            {
                if(max<c[i])
                {
                    max=c[i];
                    l=p=i;
                }
            }
        }
     
    if(max>2147483647)
        printf("piease atart again ");
    printf(" ");
    printf("maximum array is=%d ",max);
    printf("最大子数组为 ");
    for(i=l;i<=p;i++)
    {
        printf("  %d   ",n[i]);
    }
    return 0;
}

 五。实验结果图片

技术分享图片

技术分享图片

六。实验总结。

  通过本次实验深刻的理解实验思路和将问题降维的重要性,将数组重新存储是想通过两个循环实现,最后发现一个if语句就可以实现,真的是太重要,期待下次实验

以上是关于循环数组的子数组最大和的主要内容,如果未能解决你的问题,请参考以下文章

51Nod1050 循环数组最大子段和

1050 循环数组最大子段和

dp - 循环数组的最大和

左神算法课子数组最大差值小于某阈值,求满足条件的子数组个数

最大子数组和

编程之美 2.14求数组的子数组之和的最大值