首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化算法计算最大合计的子串

优化算法计算最大合计的子串
EN

Stack Overflow用户
提问于 2011-08-05 20:20:15
回答 2查看 150关注 0票数 1

什么是优化/智能算法,以获得最大总子序列从以下系列的'n‘个数字的例子:

代码语言:javascript
运行
复制
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 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-06 18:52:40

您可以很容易地实现O(n)算法;我可以想到两种方法:

1) DP:

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

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

首先,创建一个前缀和数组,这样前缀就是元素0...i的总和。现在,如果你有一个从a到b的子序列,那么它的和显然是prefix[b] - prefix[a - 1]的(a=0是一个很容易处理的特例)。现在假设我们固定了b,那么最优选择应该最小化前缀a- 1。所以我们可以迭代所有的i,保持到目前为止的最小前缀j。答案就是所有步骤的最大值,每一步:prefix[i] - prefix[j]

下面是伪代码:

代码语言:javascript
运行
复制
// 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] );
票数 1
EN

Stack Overflow用户

发布于 2011-08-05 20:24:35

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6956152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档