Algorithm 求最长交替序列长度的动态算法
LetA=〈a1,an〉是一个数字序列,其中n>0,每个数字都是ai∈{0,1}. 一个子序列〈ai1,A的aik〉是一系列元素,因此i1我认为不需要DP解决方案 贪婪的方法是最直接的方法。 总结:由于列表只包含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:
[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)算法似乎要困难得多