求最大子序列和

来源:互联网 发布:网络写手新手指南 编辑:程序博客网 时间:2024/05/08 17:28
 

/*功能:求最大子序列和*/

#include<stdio.h>
#include<stdlib.h>
/*立方法*/
static int max_sum1(int *array,int n)
{
 int i,j;
 int sum=0;
 for(i=0;i<n;i++){
  for(j=i;j<n;j++){
   int k;
   int sub_sum=0;
   for(k=i;k<=j;k++){
    sub_sum+=array[k];
   }
   if(sum<sub_sum) sum=sub_sum;
  }
 }
 return sum;
}
/*平方法之一:array[i->j]=array[i->j-1]+array[j]*/
static int max_sum2a(int *array,int n)
{
 int sumsofar=0;
 int i,j;
 for(i=0;i<n;i++){
  int subsum=0;
  for(j=i;j<n;j++){
   subsum+=array[j];
   if(sumsofar<subsum) sumsofar=subsum;
  }
 }
 return sumsofar;
}
/*平方法之二:assist_array[i]代表array[0->i]*/
static int max_sum2b(int *array,int n)
{
 int *tmp_arr=(int *)malloc(sizeof(int)*(n+1));
 int *assist_arr=tmp_arr+1;
 assist_arr[-1]=0;
 int i;
 for(i=0;i<n;i++){
  assist_arr[i]=assist_arr[i-1]+array[i];
 }
 int sumsofar=0;
 int j;
 for(i=0;i<n;i++){
  for(j=i;j<n;j++){
   if(sumsofar<assist_arr[j]-assist_arr[i-1])
    sumsofar=assist_arr[j]-assist_arr[i-1];
  }
 }
 return sumsofar;
}
/*分治递归算法*/
static int max_sum3(int *array,int n)
{
 if(n<1) return 0;
 if(n==1) return (array[0]>0?array[0]:0);
 int m=n/2;
 int sum=0;
 int left_max=0;
 int i;
 for(i=m;i>=0;i--){
  sum+=array[i];
  if(left_max<sum) left_max=sum;
 }
 int right_max=0;
 sum=0;
 for(i=m+1;i<=n-1;i++){
  sum+=array[i];
  if(right_max<sum) right_max=sum;
 }
 sum=left_max+right_max;
 left_max=max_sum3(array,m);
 right_max=max_sum3(array+m,n-m);
 if(sum<left_max) sum=left_max;
 if(sum<right_max) sum=right_max;
 return sum;
}
/*线性算法*/
static int max_sum4(int *array,int n)
{
 int max_endhere=0;
 int maxsofar=0;
 if(array[0]>0){
  max_endhere=array[0];
  maxsofar=array[0];
 }
 int i;
 for(i=1;i<n;i++){
  if(max_endhere+array[i]>0)
   max_endhere+=array[i];
  else
   max_endhere=0;
  if(max_endhere>maxsofar)
   maxsofar=max_endhere;
 }
 return maxsofar;
}
int main(int argc,char *argv[])
{
 int arr[]={31,-41,59,26,-53,58,97,-93,-23,84};
 printf("%d\n",max_sum4(arr,10));
 return 0;
}

原创粉丝点击