您的位置:首页 > 其它

关于如何查找数组中和最大的子序列

2010-05-21 21:41 288 查看

关于如何查找数组中和最大的子序列

问题:给定一个数组,如{-1,3,6,-9,2,-5,-1,9,3,-3},求该数组中的和最大的子序列。
思路:最简单的方法,以每个元素作为起点,再考虑1~n所有的子序列元素个数的情况,这样的复杂度就为O(n*n). 之后我们讨论了如何简化数组,比如相邻的正数可以将其绑定,两端的负数可以直接排除,最后数组可以被简化为两端为正数,中间没有相邻正数的形式。然而,这样并没有从根本上降低算法的复杂度,我们的讨论没有切中问题的要害。后来,发现上学期的算法课上已经有了现成的算法,分治策略的复杂度为O(nlogn),动态规划算法的复杂度为O(n).看来一个好算法可以大大的降低解决问题的代价。最后我们采用了动态规划算法。
算法实现
/*算法思想:使用动态规划算法,
b[i]=max{b[i-1]+a[i],a[i]},i=0,1,2,...,n-1
b[i]表示最后一项为a[i]的序列构成的最大子段和
最优解为b[i]中的最大值
*/
int MaxSub(int a[],int n,int& begin,int& end)//a[]是给定的数组,n是数组中元素个数,begin和end分别记录起始项和末项
{
int sum=0;//最大子段和
int b=0;//最后一项为a[i]的序列构成的最大子段和
for(int i=0;i<n;i++)
{
if(b>0)
{
b=b+a[i];
}
else
{
b=a[i];
begin=i;//记录起始项
}
if(b>sum)
{
sum=b;
end=i;//记录末项
}
}
return sum;
}
程序结果:输入数组{-1,3,6,-9,2,-5,-1,9,3,-3}得到最大和子序列{9,3}
感想:我们在讨论问题的时候应该从解决问题的本质出发,课上我们组的讨论似乎偏离了这个方向,看来我这个PM没有做好。动态规划算法很简单,但是没有学过算法的人可能不是那么容易想的到。我想我得好好的把算法这门课补一补了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: