返回一个整数数组中最大子数组的和3

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

要求:

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

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

      如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

      同时返回最大子数组的位置。

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

思路:利用for循环实现首位相连

代码:

#include<iostream>

#include<time.h>

#include <stdio.h>

#include <stdlib.h>

using namespace std;

  int max_subarray_bound(int a[],int from,int to)

{    

      int i,max,sum;        

      max = a[from];    

      sum = a[from];        

     for(i = from + 1;i <= to;i++)  

{         if(sum < 0)            

                 sum = 0;        

                 sum += a[i];        

           if(max < sum)            

                max = sum;    

}

    return max;

}

int max_subarray_cycle(int a[],int size)

{     int sum,i,j,s,m;          

sum = max_subarray_bound(a,0,size-1);    

 

    if(size == 2) return sum;

    i = 1;     j = size-2;

    s = a[i-1] + a[j+1];        

   while(i < j && (a[i] >=0 || a[j] >= 0))  

{         if(a[i] >= 0)   

             {            

                      s += a[i];            

                        i++;        

            }                

        if(a[j] >= 0)   

            {             s += a[j];            

                           j--;        

           }    

  }        

       if(i == j)  

           {        

                  if(a[i] >0)  

                         s+=a[i];        

                 if(s < sum)

                          return sum;        

                 else return s;    

          }        

        if(i < j)  

            {            

         int s2,k;        

          m = a[i];        

          s2 = m;        

         for(k=i+1;k <= j;k++)   

                {            

                     s2 += a[k];            

                    if(m < s2)                

                    m = s2;        

              }                

              s2 = a[j];        

             for(k = j-1;k>=i;k--)  

                  {               s2 += a[j];            

                                  if(m < s2)                

                                                m = s2;        

                }                

                 if(m > 0)            

                       s += m;    

    }        

  if(s < sum)

           return sum;    

   else return s;    

}

int main(int argc,char *argv[])

{    

 int num,*a;  

cout<<"请输入以为数组的长度:";  

cin>>num;  

a = new int [num];    

srand((unsigned)time(NULL));    

for(int i=0;i<num;i++)   

{      a[i]=rand()%100-25;     

        cout<<a[i]<<"  ";      

}  

    cout<<endl;    

     cout<<"环形一维数组子数组和的最大值:  "<<max_subarray_cycle(a,num)<<endl;    

   delete a;     

    return 0;

}

截图:

总结:刚开始用的是课堂上说的那种方法,但是还是没有做出来还是在网上找的例子

 

posted @ 2015-05-29 08:38  嘴角上扬的马先生  阅读(161)  评论(0编辑  收藏  举报