最大子序列和问题

问题: 
给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大 

例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O(n^3)。
    显然这种方法不是最优的,下面给出一个算法复杂度为O(n)的线性算法实现,算法的来源于Programming Pearls一书。在给出线性算法之前,先来看一个对穷举算法进行优化的算法,它的算法复杂度为O(n^2)。其实这个算法只是对对穷举算法稍微做了一些修改:其实子序列的和我们并不需要每次都重新计算一遍。

int max_sum(int a[],int size)
{
	int max=a[0];
	for (int i=0;i!=size;i++)
	{
		int v=0;
		for (int j=i;j!=size;j++)
		{
			v+=a[j];
			if(max<v)
				max=v;
		}
	}
	return max;
}
下面是动态规划代码,其时间复杂度为 O(n):
int max_sum(int a[],int size)
{
	int max=0,temp=0;
	for (int i=0;i!=size;i++)
	{
		temp+=a[i];
		if(temp>max)
			max=temp;
		else if(temp<=0)
            temp=0;		
	}
	return max;
}

可以参考::最大子序列和问题

你可能感兴趣的:(算法,优化)