最大子序列问题

题目:给定一个整数列(可能有负数),求该整数列每个子序列的和的最大值,如果都为负数则结果为0;

例如:对于输入:-2,11,-4,13,-5,-2   ,答案为20(从11 到 13,即就是:11+(-4)+13=20 )

粗略代码如下(代码已测试通过):

#include <iostream>
using namespace std;

//arr:目标数组,length:数组长度

//方法一:复杂度为:O(N^3)
int maxSubSum1(const int arr[],int length)
{
	int maxSum=0;

	for(int i=0;i<length;i++)
	{
		for(int j=i;j<length;j++)
		{
			int thisSum=0;
			for(int k=i;k<=j;k++) //每次都是从i开始加到j,共i*(j-i)次
			{
				thisSum+=arr[k];
			}
			if(thisSum>maxSum)
			{
				maxSum=thisSum;
			}
		}
	}
	return maxSum;
}

//方法二:复杂度为:O(N^2)
int maxSubSum2(const int arr[],int length)
{
	int maxSum=0;
	for(int i=0;i<length;i++)//i表示当前序列起始点
	{
		int thisSum=0;
		for(int j=i;j<length;j++)//j表示当前序列终点
		{
			thisSum+=arr[j]; //推前一个则加一个数=累加

			if(thisSum>maxSum)
			{
				maxSum=thisSum;
			}
		}
	}
	return maxSum;
}

//方法三:复杂度为O(N)
int maxSubSum3(const int arr[],int length)
{
	int maxSum=0,thisSum=0;
	for(int i=0;i<length;i++)
	{
		thisSum+=arr[i];

		if(thisSum>maxSum)
		{
			maxSum=thisSum;
		}
		else if(thisSum<0) //如果累加结果为负数则从0开始,也就是从下一个数开始序列
		{
			thisSum=0;
		}
	}
	return maxSum;
}

int main()
{
	int arr[6]={-2,3,-4,13,-5,6};

	//int result=maxSubSum1(arr,6);
	//int result=maxSubSum2(arr,6);
	int result=maxSubSum3(arr,6);

	cout<<result<<endl;
}
posted @ 2011-10-23 11:24  it笨笨  阅读(507)  评论(0编辑  收藏  举报