计算在C ++中出现在相邻两个设置位上的k次二进制字符串

我们给定整数N和K。我们有长度为N的二进制字符串,仅包含0和1。目标是找到具有K个连续1的长度为N的此类字符串的数量。即,如果N = 3,而K = 2,则计算所有可能具有2个连续1的3位二进制字符串。

示例-111,此处相邻的1出现两次(K次)。

在011和110中,相邻的1仅出现一次。

我们将通过存储先前值的结果来解决此问题。

取3D数组count [x] [y] [z]。其中x为N,y为K,z为字符串的最后一位(0或1)

  • 对于N = 1,字符串将为“ 0”和“ 1”。相邻1的计数= 0。

因此对于任何K。如果N = 1,则count = 0。

count [1] [K] [0] = count [1] [K] [1] = 0。

  • 当最后一位数字为0时,将相邻1的计数计为K

长度为N-1的所有数字加上K个+最后0→新长度= N

如果与1相邻的K个计数为C,则最后加0不会更改该计数。

count [N] [K] [0] = count [N-1] [K] [0] + count [N-1] [K] [1]

  • 当最后一位为1时,将相邻的1计数为K

长度为N-1的所有数字都以0结尾且K个+最后1个→新的长度= N,

计数[N-1] [K] [0]

长度为N-1的所有数字都以1结尾,K-1个数字+最后1→新的长度= N,

计数[N-1] [K-1] [1]

count [N] [K] [1] = count [N-1] [K] [0] + count [N-1] [K-1] [1]

这样的字符串总数= count [N] [K] [0] + count [N] [K] [1]

输入项

N=4, K=2

输出结果

Count of strings: 2

解释-1110、0111是唯一长度为4的字符串,其中相邻的1仅出现两次。

1110- “11 10”, then “1 11 0” ( splitting to show which adjacent 1’s are counted )
0111- “0 11 1”, then “01 11”. K=2, adjacent 1’s= 2 times

输入项

N=3, K=1

输出结果

Count of strings: 2

解释-110,011.是唯一长度为3的字符串,其中相邻的1出现一次。

在111中,相邻的1出现两次。

以下程序中使用的方法如下

  • 整数N和K存储字符串的长度,否。每个中出现相邻1的时间。

  • 函数stringcount(int n,int k)将n和k作为参数,并返回与K相邻的1的字符串数。

  • 数组count [i] [j] [0/1]用于存储长度为i的字符串的计数,其中j相邻于1,以0或1结尾。

  • 初始条件为count [1] [0] [0] = 1;count [1] [0] [1] = 1;

  • 现在从2个长度的字符串(i = 2)到n个长度开始。对于每个这样的字符串,请检查相邻1的K次计数。j = 0; j <= k,来自先前的计数。更新当前计数[i] [j] [0]和计数[i] [j] [1]。

  • 如果j-1> = 0,则相邻1的计数大于1。然后更新以1结尾的字符串的计数为count [i] [j] [1] + count [i-1] [j-1] [ 1];

  • 最后添加count [n] [k] [0]和count [n] [k] [1]。结果将其存储。

  • 返回结果作为所需的计数。

示例

#include <bits/stdc++.h>
using namespace std;
int stringcount(int n, int k){
   //count of strings with length=n and adajcent 1's=k
   int count[n + 1][k + 1][2]={0};
   //count[n][k][0] -- strings with length=n and adajcent 1's=k last character is 0
   //count[n][k][1] -- strings with length=n and adajcent 1's=k last character is 1
   // If n = 1 and k = 0.
   count[1][0][0] = 1;
   count[1][0][1] = 1;
   for (int i = 2; i <= n; i++) {
      // number of adjacent 1's can not exceed i-1
      for (int j = 0; j <= k; j++) {
         count[i][j][0] = count[i - 1][j][0] + count[i - 1][j][1];
         count[i][j][1] = count[i - 1][j][0];
      if (j - 1 >= 0)
         count[i][j][1] =count[i][j][1] + count[i - 1][j - 1][1];
      }
   }
   int result=count[n][k][0]+count[n][k][1];
   return result;
}
int main(){
   int N = 6, K = 3;
   cout <<"Strings of length 6 and 3 adjacent 1's in each :"<< stringcount(N,K);
   return 0;
}

输出结果

Strings of length 6 and 3 adjacent 1's in each :7