优化/智能算法将从以下一系列'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
答案 0 :(得分:1)
答案 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] );