求连续子序列最大和
2009-03-02 15:24
337 查看
求连续子序列最大和的问题是一个很有趣的问题,我们在学习程序语言时经常会做一些这样的练习。 这个之所以有趣,是因为有很多算法可以解决它,而这些算法的性能又相差很。 下面给出用boo语言实现的三种解决方法:
1、最简单的方法就是直接穷尽查找,即遍历所有可能的子序列,对每一个可能的子序列,计算出它们的和,最后返回最大的和。
这个方法的优点就是极其简单,然而通常这种算法效率却不是很好。
2、如果我们从上面的方法中删除一个循环,就可以降低这个算法的运行时间。 通过观察可以看到上面的算法有很多不必要的计算,我们可以将内层的for循环去掉,以提高效率。
3、可以看出第二个算法的效率与第一个相比,已经提高很多了,但第二个算法还是穷尽查找,也就是说,我们还是测试了所有可能的子序列。我们可以从中排除很多不可能的子序列。下面我给出第三个算法的实现代码,对于这个算法的正确性,可以通过数学推理去证明。
1、最简单的方法就是直接穷尽查找,即遍历所有可能的子序列,对每一个可能的子序列,计算出它们的和,最后返回最大的和。
import System def maxSubsequenceSum1(*args as ( int )): maxSum = 0 maxSum = 0 for i in range(args.Length): for j in range(i, args.Length): thisSum = 0 thisSum = 0 for k in range(i, j): thisSum += args[k] thisSum += args[k] if thisSum > maxSum: maxSum = thisSum seqStart = i seqEnd = j return maxSum
这个方法的优点就是极其简单,然而通常这种算法效率却不是很好。
2、如果我们从上面的方法中删除一个循环,就可以降低这个算法的运行时间。 通过观察可以看到上面的算法有很多不必要的计算,我们可以将内层的for循环去掉,以提高效率。
import System def maxSubsequenceSum2(*args as ( int )): maxSum = 0 maxSum = 0 for i in range(args.Length): thisSum = 0 for j in range(i, args.Length): thisSum += args[j] if thisSum > maxSum: maxSum = thisSum seqStart = i seqEnd = j return maxSum
3、可以看出第二个算法的效率与第一个相比,已经提高很多了,但第二个算法还是穷尽查找,也就是说,我们还是测试了所有可能的子序列。我们可以从中排除很多不可能的子序列。下面我给出第三个算法的实现代码,对于这个算法的正确性,可以通过数学推理去证明。
import System def maxSubsequenceSum3(*args as ( int )): maxSum = 0 thisSum = 0 for j in range(args.Length): i = 0 thisSum += args[j] if thisSum > maxSum: maxSum = thisSum seqStart = i seqEnd = j elif thisSum < 0: i = j + 1 thisSum = 0 return maxSum
相关文章推荐
- hdu 1231 最大连续子序列
- OJ_1011 最大连续子序列
- 九度OJ 1011:最大连续子序列 (DP)
- 最大连续子序列和-动态规划
- 最大连续子序列----DP动态规划
- POJ 2750 线段树——环序列最大连续子序列和
- 最大连续子序列问题
- hdu 5586(最大连续子序列和)
- Hdu 1231 最大连续子序列
- 求最大连续子序列之和 立方算法
- HDU 2845 Beans (最大不连续子序列和)(压缩求解)
- 最大连续子序列HDU1231
- hdu-1003-动态规划-求连续子序列最大和问题
- HDU - 1231——最大连续子序列
- hdu 1231 最大连续子序列(dp)
- hdu 最大连续子序列
- HDU 1231 最大连续子序列
- 最大连续子序列之和算法进化历程
- HDU Problem A [ 最大连续子序列和 ]——基础DP
- 最大连续子序列的和