求一个整型数组的最大子数组的和

团队成员:迟真真 冯小兰

求一个整型数组的最大子数组的和

看到这个题目,是这样想的:

子数组的元素个数为1个,2个,3个、、、、、n个

#include<stdio.h>
#define M 100
void main()
{ 
    int a[M];
    int i,j,N;
    int m=0,max=0;
    int n;
    printf("输入数组个数  ");
    scanf("%d",&n);
    N=n-1;
    printf("输入数组元素  ");
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);

    for(i=0;i<n;i++)    //比较一个元素时的最大值
    {
        if(a[i]>max)
        
        {
            max=a[i];
        }
    }

    while(N>0)     //比较相邻2,3。。n个相邻元素时的最大值
    {
       for(i=0;i<N;i++)
       { 
           m=0;
           for(j=0;j<=(n-N);j++)  //计算相邻的(n-N+1)的和,赋给m
           {
               m=m+a[i+j];
           }
           if(m>max)
           {
            max=m;
           }
         }
       N--;   
    }
    printf("最大为:%d",max);

  
}

后来又想了一种这样的方法,如下:

a[0]

a[0]+a[1]

a[0]+a[1]+a[2]

……

a[0]+a[1]+a[2]+……a[n-1]

     a[1]

     a[1]+a[2]

     a[1]+a[2]+a[3]

     ………

     a[1]+ a[2]+a[3]+……..a[n-1]

          a[2]

          a[2]+a[3]

          a[2]+a[3]+a[4]

          ………..

          a[2]+a[3]+a[4]+……a[n-1]

      ………..

以此类推:

                          a[i]

                          a[i]+a[i+1]

                         …….

                          a[i]+a[i+1]………a[n-i]

因此可以找到规律,然后用3个for循环语句。

#include<stdio.h>
void main()
{
    int a[100];
    int i,j,n;
    int k;
    int m=0,max;
    printf("请输入数组元素的个数:");
    scanf("%d",&n);
    printf("请输入数组元素:");
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);

    max=a[0];
    for(i=0;i<n;i++)
    {    
        
        for(j=i;j<n;j++)
        {
            m=0;
            for(k=i;k<=j;k++)
            {
                m=m+a[k];
            }
            if(m>max)
            {
                max=m;
            }
        }
    }
    printf("最大子数组的和为:%d\n",max);


}

但是考虑到时间空间复杂度,这种方法貌似不太好

可以先比较出和的最大值,把这些和的最大值放在一个数组中,然后再求这个数组的最大值。

 

运行结果:

下面是分析的过程草稿:

欢迎指正!

 

 

posted @ 2014-03-10 18:52  真真-是我  阅读(363)  评论(2编辑  收藏  举报