Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 인접한 두 세트 비트가 k 번 나타나는 이진 문자열 계산

<시간/>

정수 N과 K가 주어졌습니다. 길이가 N이고 0과 1만 포함된 이진 문자열이 있습니다. 목표는 K개의 연속적인 1을 갖는 길이가 N인 문자열의 수를 찾는 것입니다. 즉, N=3이고 K=2인 경우 2개의 연속적인 1이 있는 가능한 모든 3자리 이진 문자열을 계산합니다.

− 111, 여기에 인접한 1이 두 번 나타납니다( K 번 ).

011과 110에서는 인접한 1이 한 번만 나타났습니다.

이전 값의 결과를 저장하여 이를 해결합니다.

3D 배열 개수[x][y][z]를 사용합니다. 여기서 x는 N, y는 K, z는 문자열의 마지막 숫자(0 또는 1)

  • N=1인 경우 문자열은 "0"과 "1"이 됩니다. 인접한 1의 개수=0.

따라서 모든 K에 대해. N=1이면 count=0입니다.

개수[1][K][0] =개수[1][K][1] =0.

  • 마지막 숫자가 0일 때, 인접한 1을 K로 간주하기 위해

길이가 N-1인 모든 자릿수(K개의 1 + 마지막 0 포함) → 새 길이 =N

K 인접 1의 개수가 C인 경우 끝에 0을 추가해도 해당 개수는 변경되지 않습니다.

개수[N][K][0] =개수[N-1][K][0] + 개수[N-1][K][1]

  • 마지막 숫자가 1일 때, 인접한 1을 K로 간주하기 위해

0으로 끝나는 길이 N-1의 모든 자릿수 K 1 + 마지막 1 → 새 길이 =N,

개수[N-1][K][0]

N-1 길이의 모든 숫자가 1로 끝나는 K-1 1 + 마지막 1 → 새 길이 =N,

개수[N-1][K-1][1]

개수[N][K][1] =개수[N-1][K][0] + 개수[N-1][K-1][1]

총 문자열=count[N][K][0] + count[N][K][1]

입력

N=4, K=2

출력

Count of strings: 2

설명 − 1110, 0111은 인접한 1이 두 번만 나타나는 길이가 4인 유일한 문자열입니다.

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.은 인접한 1이 한 번 나타나는 길이가 3인 유일한 문자열입니다.

111에서 인접한 1이 두 번 나타납니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • 정수 N과 K는 문자열의 길이와 no를 저장합니다. 인접한 1이 각각 나타나는 횟수입니다.

  • stringcount(int n, int k) 함수는 n과 k를 매개변수로 사용하고 1에 인접한 K번의 문자열 개수를 반환합니다.

  • 배열 count[i][j][0/1]은 0 또는 1로 보내는 j가 인접한 1인 길이 i의 문자열 개수를 저장하는 데 사용됩니다.

  • 초기 조건은 count[1][0][0] =1입니다. 개수[1][0][1] =1;

  • 이제 2개의 길이 문자열(i=2)에서 n개의 길이로 시작합니다. 이러한 각 문자열에 대해 Ktimes 인접한 1의 수를 확인합니다. j=0;j<=k, 이전 카운트에서. 현재 개수[i][j][0] 및 개수[i][j][1]를 업데이트합니다.

  • j-1>=0이면 인접한 1의 개수가 1보다 큽니다. 그런 다음 count[i][j][1] + count[i - 1][j - 1][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