关于如何查找数组中和最大的子序列
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没有做好。动态规划算法很简单,但是没有学过算法的人可能不是那么容易想的到。我想我得好好的把算法这门课补一补了。
相关文章推荐
- 如何查找数组中和最大的子序列
- 关于如何查找数组中和最大的子数组
- 求数组中和最大的子序列
- 寻找数组中和最大的子序列
- 求数组中和最大子序列
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 算法-子数组连续序列最大和其时间复杂度如何从O(n^3)到O(n)
- 求数组中和最大的子序列
- 取数组中和最大的一段连续序列
- 求出int数组中和最大的子序列
- 求数组中和最大的子数组并输出子数组序列
- 查找数组最大子序列和
- 如何使用C++递归来实现查找BST(Binary Search Tree)的最大高度
- [置顶] 如何查找数组中的众数
- 查找数组中和为s的两个数字
- 关于大小型项目如何最大限度提高WebAPi性能
- PHP 查找有序数组中和为n的数对
- 求数组中和最大的子数组(数组中和最大的子串)
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- java关于ArrayList动态数组与静态数组Arrays-元素比较输出最大最小值的使用例子