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

关于如何查找数组中和最大的子序列
问题:给定一个数组,如{-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没有做好。动态规划算法很简单,但是没有学过算法的人可能不是那么容易想的到。我想我得好好的把算法这门课补一补了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值