最大序列和问题

来源:互联网 发布:詹姆斯身体素质知乎 编辑:程序博客网 时间:2024/06/05 07:45

问题描述:

给定整数(可以为负数),A1,A2,A3,....,AN,求子序列最大的值

举例:

对数组a[N] 例如下a[7]={4,-3,5,-2,-1,2,6,-2}其最大序列和为4+(-3)+5+(-2)+(-1)+2+6 = 11

之后即为书中提到的四种方法及解释


算法1


前两种算法的思路和程序都比较简单,一眼就能看懂。所以不做讲解

以上这个函数 1-4行是处理的基准情况,当left=right,那就只有一个元素,并且当该元素非负数

6-7行为两次递归,计算出前半部分和后半部分最大序列和,分别为7和8

8-12行及13-17行计算半边的最大和和到中间分界处的和。

#include "StdAfx.h" //#include "stdafx.h"  int MaxSubs(const int A[], int N)  { int ThisSum,MaxSum,j; ThisSum=MaxSum=0; for(j = 0;j<N;j++) { ThisSum += A[j]; if (ThisSum > MaxSum) { MaxSum = ThisSum; } else if (ThisSum < 0) { ThisSum = 0; }}  return MaxSum; } 
 int _tmain(int argc, _TCHAR* argv[]) { int A[]={4,-3,5,-2,-1,2,6,-2}; int N= 8; int M = MaxSubs(A,N); for(int i=0;i<N;i++) printf("%d ",A[i]);     printf("最大虚列数为:%d",M); return 0; } 


如上既是算法四的思想写成的。

第四种算法的时间复杂度为O(N)  刚开始没看太懂,细看之后发现该算法效率最高且计算时间最短,第一种算法用了三个for循环,第二种算法两个for循环,相当于是把1-N所有可能计算了一遍,保留最大值 

第三种比较巧妙,将一个数组分为前后两部分,分别计算两部分的最大数列,使用递归的思想。 

且第四种算法还有一个优点是对数据只进行了一次读取。

原创粉丝点击