环数组的最大子数组

#include<stdio.h>
#define N 1000
#define INF 10000
int MaxSubSum(int * arr,int n ,int Size)
{
    int maxSum = -INF;
    int sum = 0;
    int i=0;
    for(  i = n; i < n+Size; i++)
    {
        if(sum < 0)
        {
            sum = arr[i];
        }
        else
        {
            sum += arr[i];
        }
        if(sum > maxSum)
        {
            maxSum = sum;
        }
    }
    return maxSum;
}
int seekmax(int*arr,int Size)
{
    int m=arr[0];
    int i=0;
    for(  i = 0; i < Size; i++)
    {
        if(m<arr[i])
        {
           m=arr[i];
        }
    }
    return m;
}



int main()
{
    int BreakRing(int *arr,int Size);
    int MSS;
    int i;
    int j=0;
    int n=0;
    int arr[N]={0};
    char c;//用来判断何时停止输入的
    printf("input N number:\n");
    for(i=0;i<N;i++)
    {
        scanf("%d",&arr[i]);
         scanf("%c",&c);
        j++;//计数器
        if(c=='\n')//打入回车则自动结束
        {
          break;
        }
    }
    printf("环数组:\n");

    for(i=0;i<j;i++)//原数组打出屏幕
    {
        printf("%d  ",arr[i]);
    }

    printf("\n");

    MSS=BreakRing(arr,j);
    printf("结果:\n");

    printf("Mss=%d\n",MSS);
    return 0;

}
int BreakRing(int *arr,int Size)
{
    int b[N]={0};
    int i;
    int j=0;
    int Max;
    int k=0;
    int Max1[N]={0};
    for(i=0;i<Size;i++)
    {
        b[i]=arr[i];
    }
     for(i=Size;i<2*Size-1;i++)
    {
        b[i]=arr[j++];
    }
    printf("打开:\n");

    for(i=0;i<2*Size-1;i++)//数组打出屏幕
    {
        printf("%d  ",b[i]);
    }
    printf("\n");
    for(k=0;k<Size;k++)
    {
        Max1[k]=MaxSubSum(b,k,Size);

    }
     Max=seekmax(Max1,Size);
    return Max;
}

运行截图:

解决思路:

老师课堂上已经讲过了一点思路,即把环数组拆开成一维数组。但为了保证可以从最后一个开始,经第一个进行循环,要对数组进行变形,将一个周期填充满,这样就保证了循环(如图所示)。

 然后我构造了数组b,将展开的数组存入。

然后以size为步长,反复调用先前构造的MaxSubSum函数,得到一个序列,其中最大值即为所求。

 

 

posted on 2018-11-04 17:39  刘浩20160729  阅读(72)  评论(0编辑  收藏  举报

导航