📜  门| GATE-CS-2016(套装1)|问题 11(1)

📅  最后修改于: 2023-12-03 14:58:31.268000             🧑  作者: Mango

门| GATE-CS-2016(套装1)|问题 11

这个问题是关于动态规划的。给定一个十进制数n,找到n位二进制数中没有相邻1的数的数量。例如,当n为3时,这样的数字是:000,001,010,100,101。

动态规划解决方案

一个长度为n的二进制数字有以下两个情况之一:

  1. 第n位是0,这个二进制数字的可能性等于第n-1位为0或1的二进制数字的总和。
  2. 第n位是1,这个二进制数字的可能性等于第n-2位为0的二进制数字的总和。

对于n >= 1有以下两种情况:

  1. 当第n个二进制位为0时,前n-1个二进制位可以是所有没有相邻1的n-1个二进制数字的组合,即
    a[n]=a[n-1]+b[n-1]
    
  2. 当第n个二进制位为1时,前n-1个二进制位必须是以0为结尾的没有相邻1的n-2个二进制数字的组合,即
    b[n]=a[n-1]
    

根据上述公式,我们可以编写以下程序来解决这个问题:

def count_binary_strings(n: int) -> int:
    a = [0] * (n + 1)
    b = [0] * (n + 1)
    a[1] = 1
    b[1] = 1
    
    for i in range(2, n + 1):
        a[i] = a[i - 1] + b[i - 1]
        b[i] = a[i - 1]
        
    return a[n] + b[n]

result = count_binary_strings(3)
print(result)  # 输出 5

在上述代码中,我们使用两个数组a和b来计算我们需要的数量。a是以0结尾的没有相邻1的n位二进制数字的数量,b是以1结尾的没有相邻1的n位二进制数字的数量。

时间复杂度

在这个程序中,我们有一个循环,其迭代次数是n。因此,时间复杂度是 O(n)。