计算没有连续 1 的二进制字符串

data structurealgorithmsdynamic programming

在这个问题中,我们必须找到一些没有连续 1 的二进制数。在一个 3 位二进制字符串中,有三个二进制数 011、110、111 有连续的 1,还有五个数字没有连续的 1。因此,将此算法应用于 3 位数后,答案将为 5。 

如果 a[i] 是二进制数的集合,其位数为 I,且不包含任何连续的 1,而 b[i] 是二进制数的集合,其位数为 I,且包含连续的 1,则存在如下递归关系:

a[i] := a[i - 1] + b[i - 1]
b[i] := a[i - 1]

输入和输出

输入:
此算法采用二进制数的位数。假设输入为 4。
输出:
它返回没有连续 1 的二进制字符串的数量。
结果是:8。(有 8 个二进制字符串没有连续的 1)

算法

countBinNums(n)

输入:n 是位数。
输出 − 计算有多少个数字没有连续的 1。

开始
   定义以 0 结尾和以 1 结尾的字符串列表
   endWithZero[0] := 1
   endWithOne[0] := 1

   for i := 1 to n-1, do
      endWithZero[i] := endWithZero[i-1] + endWithOne[i-1]
      endWithOne[i] := endWithZero[i-1]
   done
   return endWithZero[n-1] + endWithOne[n-1]
结束

示例

#include <iostream>
using namespace std;

int countBinNums(int n) {
   int endWithZero[n], endWithOne[n];
   endWithZero[0] = endWithOne[0] = 1;

   for (int i = 1; i < n; i++) {
      endWithZero[i] = endWithZero[i-1] + endWithOne[i-1];
      endWithOne[i] = endWithZero[i-1];
   }
   return endWithZero[n-1] + endWithOne[n-1];
}

int main() {
   int n;
   cout << "输入位数:"; cin >> n;
   cout << "没有连续 1 的二进制数的数量:"<<countBinNums(n) << endl;
   return 0;
}

输出

输入位数:4
没有连续 1 的二进制数的数量:8

相关文章