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

Algorithm 求最长交替序列长度的动态算法,algorithm,Algorithm,LetA=〈a1,an〉是一个数字序列,其中n>0,每个数字都是ai∈{0,1}. 一个子序列〈ai1,A的aik〉是一系列元素,因此i1我认为不需要DP解决方案 贪婪的方法是最直接的方法。 总结:由于列表只包含[0,1],您只需检查值在序列中的更改次数;这就是最大交替子序列的长度 时间复杂度:O(N) 以下是工作代码: count = 1 ll = [0,1,0,0,0,1,0] lval = ll[0] for item in ll[1:]: if item != lval:

LetA=〈a1,an〉是一个数字序列,其中n>0,每个数字都是ai∈{0,1}. 一个子序列〈ai1,A的aik〉是一系列元素,因此i1我认为不需要DP解决方案

贪婪的方法是最直接的方法。 总结:由于列表只包含
[0,1]
,您只需检查值在序列中的更改次数;这就是最大交替子序列的长度

时间复杂度:O(N) 以下是工作代码:

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)
输出:

5
编辑 如果您仍在寻找DP解决方案,以下是O(N)解决方案:

D[i][j]表示索引
i
之前的最大交替子序列的长度,其最后一个值为
j

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]))
设计O(n)算法很容易(计算转换的数量,但不是DP?)。在这里设计O(n^2)算法似乎要困难得多