优化算法以最大总计计算子串

时间:2011-08-05 12:20:15

标签: algorithm

优化/智能算法将从以下一系列'n'数字中获得最大总子序列     示例:

Input:             Index   0  1  2  3  4  5  6  7 
                   Series -1  0  3 -2  5 -2  6  1

trials  :          start :4 end :7 total :10
                   start :6 end :7 total :7


Output (Max Total Sub-sequence):  start :2  ,end:7 , total:11 

2 个答案:

答案 0 :(得分:1)

存在线性算法。例如,请参阅此http://wordaligned.org/articles/the-maximum-subsequence-problem

答案 1 :(得分:1)

您可以轻松实现O(n)算法; 我有两种方式可以想到:

1)DP:

设dp [i]是在元素i结束的最大子序列的长度,然后是dp[0] = element[0]。对于每个我,dp[i] = max( dp[i - 1] + element[i], element[i] )。那是因为你有两个选择,要么将当前元素添加到前一个最大子序列,要么创建一个新元素。取决于所有我的最大值,这就是你的答案。您可以通过轻松跟踪更改来找到开头和结尾。

2)一个简单直观的算法:

首先,创建一个前缀和数组,以便前缀[i]是元素0...i的总和。现在,如果你有一个从a到b的子序列,那么它的总和显然是prefix[b] - prefix[a - 1](a = 0是一个可以轻松处理的特殊情况)。现在假设我们修复了b,那么最优选择应该最小化前缀[a-1]。所以我们可以遍历所有i,保持最小前缀[j]到目前为止。答案只是每个步骤的最大步骤:prefix[i] - prefix[j]

这是伪代码:

// Compute prefix sum array easily and trivially ( ask me if you want how )

int curMin = 0, answer = - INFINITY;

for i = 0 to n - 1

      answer = max( answer, prefix[i] - curMin );

      curMin = min( curMin, prefix[i] );