我尝试过这个问题,根据包含和排除的原理,我可以得到149的答案,但是标准的书籍解决方案给出的结果是147。我想确认我是对还是错。我希望从我的标准书中获得详细答案,这是我的问题和清晰的答案。强文本
答案 0 :(得分:0)
正确答案似乎是147。 我通过构造一个二叉树来穷举搜索,该二叉树的节点的值为0或1,其从根到叶的路径对应于所有可能的8位字符串(也就是说,我们从根开始,有两个分支导致两个具有0和1值的1级节点。从每个这样的节点,我们绘制另外两个分支,这些分支导致两个具有0和1值的2级节点。我们像这样进行操作,直到建立所有可能的路径为止。这里需要进行一些修剪:当路径之一具有三个连续的0或四个连续的1时,我们就在此处停止。同样,如果到目前为止构建的路径不允许包含三个0或四个1的序列,我们也将在此处停止。
下面有一个简单的 python 代码及其实现(未优化,仅执行了一些修剪)。
def pruning_pos(lst):
'''Pruning function over a list ('lst')'''
if len(lst) >= 3:
# if there are three consecutive 0's...
if lst[-3:] == [0, 0, 0]:
return True
else:
if len(lst) >= 4:
# if there are four consecutive 1's...
if lst[-4:] == [1,1,1,1]:
return True
return False
paths = [[0], [1]]
count = 0
for i in xrange(7):
new_paths = [] # candidate paths
for c in paths:
for elem in [c+[1], c+[0]]:
if pruning_pos(elem): # if it contains sequence of interest...
count += 2**(8-len(elem)) # count all subpaths we are pruning
else:
new_paths.append(elem)
paths = new_paths[:]
print count