有多少个长度为八的位串包含三个连续的零或四个连续的零?

时间:2018-11-11 10:01:29

标签: discrete-mathematics

我尝试过这个问题,根据包含和排除的原理,我可以得到149的答案,但是标准的书籍解决方案给出的结果是147。我想确认我是对还是错。我希望从我的标准书中获得详细答案,这是我的问题和清晰的答案。强文本

1 个答案:

答案 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