• 输入一组整数,求子数组和的最大值。(数组进行首尾相接之后)


    输入一组整数,求子数组和的最大值。

    题目:返回一个一维整数数组中最大子数组的和。

    要求:

    输入一个一维整形数组,数组里有正数也有负数。

    一维数组首尾相接,象个一条首尾相接带子一样。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。

     

    10 -9 8 7 -5 3

     

    i 4 3 2 1 0

     

    nALL : 3 3 7 15 15 16

     

    nStart: 3 -2 7 15 6 16

     

    nStart = max(arr[i], arr[i]+nStart);

    nAll = max(nAll, nStart);

    nstart来记录每次和前一个数相加之后的结果,来给原来的nall做比较,而nall则一直表示子数组和的最大值。

     

    当它首尾相接之后,可能会出现比如1,2-3,4这样的情况,应该是4+1+2是最大的子数组,所以在前面的基础上需要进行一下改进,具体方法如下:

    数组本来是1,2-3,4 现在让每个数做一次数组头,变成一个新数组,例如变成2-3,4,1还有-3,4,1,24,1,2-3这三个数组,就是把数组进行一次轮换,新来的三个数组依然各进行一次求子数组和的最大值,然后和原来数组的子数组和最大值进行比较,来得出最后的子数组和最大值。

     

    1. 源代码:/*求一个数组中子数组的和的最大值。 2016.4.11 底云飞*/
    2. #include <iostream>
    3. using namespace std;
    4. int max(int x, int y)
    5. {
    6.     return (x > y) ? x : y;
    7. }
    8. //求一个数组中子数组和的最大值
    9. int maxSum2_v(int arr[], int n)
    10. {
    11.     int i;
    12.     int nAll, nStart; //nAll子数组和的最大值
    13.     nAll = arr[n-1];
    14.     nStart = arr[n-1];
    15.     for(i = n-2; i >= 0; i--)
    16.     {
    17.           nStart = max(arr[i], arr[i]+nStart); //每次和数组的前一个数相加之后,都保留较大的数,
    18.           nAll = max(nAll, nStart); //在上面保留较大数之后,原来的最大和和现在的和比较,取较大值
    19.     }
    20.     return nAll;
    21. }
    22. void main()
    23. {
    24.    //n整数个数,arr【】数组,anotherarr[100]为进行计算的轮换数组,Max字数组和最大值
    25.    int n=100,arr[100],anotherarr[100],Max1=-100,Max=-100;
    26.    cout<<"请输入整数个数:";
    27.    cin>>n;
    28.    cout<<"请输入整数,每个数用空格隔开:"<<endl;
    29.    for(int i=0;i<n;i++)
    30.    {
    31.       cin>>arr[i];
    32.       anotherarr[i]=arr[i];
    33.    }
    34.    Max=maxSum2_v(arr,n); //调用maxSum2_v函数
    35.    for(int i=1;i<n;i++) //将数组当中的数进行一次轮换,生成新的另外的数组
    36.    {
    37.       for(int j=0;j<n;j++)
    38.       {
    39.          //开始进行轮换,等号后面需要用arr数组,如果用后来的,则会在多次循环之后,出现数组混乱
    40.          anotherarr[j]=arr[(j+i)%n];
    41.          Max1=maxSum2_v(anotherarr,n); //调用maxSum2_v函数
    42.       }
    43.       if(Max1>Max)
    44.          Max=Max1;
    45.    }
    46.    cout<<"子数组和最大为:"<<Max<<endl;
    47. }

     

    总结

    这次的子数组和练习,将原来的数组首尾相接做成链状之后,比如1,2-3,4这个数组,就会出现4,1,2三个子数组的和最大,而不是从前往后的子数组和最大,所以需要进行数组内部的轮换,让每个值都轮换做一次数组头,然后得出另外的数组,调用求子数组和最大值的方法来求出每个新数组的子数组和最大值,然后进行比较,求得子数组和的最大值。

    不能只是简单的将1,2,-3,4想象为1,2,-3,4,1,2,-3这个数组就可以,如果数组都是正数,则会多加求而得错误的最大值。

  • 相关阅读:
    (一〇八)iPad开发之横竖屏适配
    ZOJ 1414:Number Steps
    HDU 1391:Number Steps
    ZOJ 1871:Steps
    POJ 2590:Steps
    POJ 2629:Common permutation
    POJ 2562:Primary Arithmetic
    POJ 2505:A multiplication game
    HDU 1517:A Multiplication Game
    POJ 3650:The Seven Percent Solution
  • 原文地址:https://www.cnblogs.com/diyunfei/p/5379337.html
Copyright © 2020-2023  润新知