#include<iostream>
using namespace std;

//method1 
/*
 使用穷举的方法穷举出所有可能的子数组之和,然后从中找出最大值。由于使用三重循环故时间复杂度为O(N^3)
*/
int MaxSum(int* A,int n)
{
 int maximum=A[0];//maximum初始化为A[0]
 int sum;
    for(int i=0;i<n;i++)
  for(int j=i;j<n;j++)
  {
   sum=0;
      for(int k=i;k<=j;k++)
   {
        sum+=A[k];
   }
   if(sum>maximum)
   {
       maximum=sum;
   }
  }
  return maximum;
}

//method2
/*
在方案一中第三重循环求位置i到位置j之间的值的和,如果注意到sum[i,...,j]=sum[i,...j-1]+A[j];
则可以将算法中的最后一个for循环省略,避免重复计算,从而使算法得以改进,改进后的算法如下,这时
时间复杂度为O(N^2)
*/
int MaxSum2(int* A,int n)
{
  int maximum=A[0];
  int sum;
  for(int i=0;i<n;i++)
  {
   sum=0;
   for(int j=i;j<n;j++)
   {
        sum+=A[j];
     if(sum>maximum)maximum=sum;
               
   }
  }
  return maximum;
}

//method3
/*
分配一个额外的数组b[0,...,length-1],b[i]表示位置i和i之前的元素构成的子数组之和的最大值。
b[i]求解方法:若b[i-1]<0,b[i]=A[i];若b[i-1]>=0,b[i]=b[i-1]+A[i];
*/

int MaxSum3(int* A,int n)
{
     int* b=new int[n];
     b[0]=A[0];
  for(int i=1;i<n;i++)
  {
       if(b[i-1]<0)b[i]=A[i];
    else b[i]=A[i]+b[i-1];
  }
  int max=b[0];
  for(int i=0;i<n;i++)
  {
      if(b[i]>max)max=b[i];
  }
delete [] b; return max; } int main() { int *A; int n; while(cin>>n,n) { A=new int[n]; for(int i=0;i<n;i++)cin>>A[i]; int max=MaxSum(A,n); cout<<"数组的子数组之和的最大值为: "<<max<<endl; max=MaxSum2(A,n); cout<<"数组的子数组之和的最大值为: "<<max<<endl; max=MaxSum3(A,n); cout<<"数组的子数组之和的最大值为: "<<max<<endl; }
delete [] A; system("pause"); return 0; }

  

posted on 2012-11-06 20:12  吉大依恋  阅读(189)  评论(0编辑  收藏  举报