我知道如何找到最大的,连续的子序列和;但有时会有多个子序列和最大总和。所以,我需要找到具有最大总和的那些最长子序列的索引。 我唯一想到的就是蛮力。还有哪些更好的选择?
这是我在rosettacode上找到的代码,它对我的问题有一个确切的想法(但遗憾的是,我知道唯一的编程语言是Java),但它在REXX中写了:
/*───────────────────────────────────────────────────────────────*/
arg @
say 'words='words(@) 'list='@
say
sum=word(@,1)
w=words(@)
at=1
L=0
do j=1 for w; f=word(@,j)
do k=j to w; s=f
do m=j+1 to k
s=s+word(@,m)
end /*m*/
_=k-j+1
if (s==sum & _>L) | s>sum then do; sum=s; at=j; L=_; end
end /*k*/
end /*j*/
seq=subword(@,at,L)
if seq=='' then seq="[NULL]"
sum=word(sum 0,1)
say 'sum='sum/1 "sequence="seq
/*───────────────────────────────────────────────────────────────*/
结果:
input 1 2 3 4 -777 1 2 3 4 0 0
output
words=12 list=1 2 3 4 0 -777 1 2 3 4 0 0
sum=10 sequence=1 2 3 4 0 0
答案 0 :(得分:2)
如果这是作业,我建议你看看动态编程算法。特别是,您可以简化Smith-Waterman本地字符串对齐的其中一个步骤,以完成此处所需的操作。关键是要阅读最优子结构的概念并问问自己,是否存在某种子问题,我只能使用序列中每个点的本地信息来解决这个问题?