首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求最长交替序列长度的动态算法

求最长交替序列长度的动态算法
EN

Stack Overflow用户
提问于 2020-11-13 21:59:47
回答 1查看 51关注 0票数 0

LetA=be一个数列,其中n >0,每个数ai∈{0,1}。一个subsequencethen<0>、<1>、<0,1>、<1,0>and<0,1,0,1,0>are不同的交替subsequenceswhile<1,1>is不是交替的子序列。Is<0,1,0,1,0>and的最长交替子序列,长度为5。

(a)设计一个O(n^2)动态规划算法来求给定序列A的最长交替序列的长度

(b)设计一个O(n)动态规划算法,求出给定序列A的最长交替序列的长度。

EN

回答 1

Stack Overflow用户

发布于 2020-11-13 22:13:35

我认为你不需要DP解决方案来解决这个问题。

对于这一点,贪婪方法以最直接的方式工作。总结:由于列表只包含[0,1],您只需要检查序列中的值更改了多少次;这就是您的最大交替子序列的长度。

时间复杂度: O(N)

以下是工作代码:

代码语言:javascript
复制
count = 1
ll = [0,1,0,0,0,1,0]
lval = ll[0]
for item in ll[1:]:
    if item != lval:
        count += 1
        lval = item

print(count)

输出:

代码语言:javascript
复制
5

编辑

如果您仍在寻找DP解决方案,这里是O(N)解决方案:

索引Di表示最大交替子序列的长度,直到最后一个值为i j的索引i

代码语言:javascript
复制
ll = [0,1,0,0,0,1,0]

D = [[0,0] for _ in range(len(ll))]

D[0][0] = 1 if ll[0] == 0 else 0
D[0][1] = 1 - D[0][0]

for i in range(1, len(ll)):
    D[i][ll[i]] = max(1 + D[i-1][1-ll[i]], D[i-1][ll[i]])
    D[i][1-ll[i]] = D[i-1][1-ll[i]]

print(max(D[-1]))ll = [0,1,0,0,0,1,0]

D = [[0,0] for _ in range(len(ll))]

D[0][0] = 1 if ll[0] == 0 else 0
D[0][1] = 1 - D[0][0]

for i in range(1, len(ll)):
    D[i][ll[i]] = max(1 + D[i-1][1-ll[i]], D[i-1][ll[i]])
    D[i][1-ll[i]] = D[i-1][1-ll[i]]

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

https://stackoverflow.com/questions/64822245

复制
相关文章

相似问题

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