Problem-Solving/BOJ
[BOJ/백준][Gold4] 2698 : 인접한 비트의 개수 (C++)
has2
2020. 12. 13. 02:30
2698번: 인접한 비트의 개수
첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 수 2개가 공백으로 구분되어 이루어져 있다. 첫 번째 수는 n이고, 두 번째 수는 k이다. n과
www.acmicpc.net
[난이도] Gold4
[유형] DP
[풀이]
dp[n][k][f] : 첫 자리가 f로 시작하면서 크기가 n이면서 비트의 개수가 k인
수열의 개수.
f==1 : dp[n][k][f] = dp[n-1][k][0]+dp[n-1][k-1][1] (첫 자리수가 1이므로
n-1크기의 수열도 1 로 시작하면 k를 1개 줄일 수 있다.)
f==0 : dp[n][k][f] = dp[n-1][k][1]+dp[n-1][k][0]
종료조건은 n이 1씩 감소하는게 보장되므로 n==2인 경우로 처리한다.
#include <cstdio>
#include <cstring>
using namespace std;
int tc,N,K,dp[102][101][2];
int sol(int n,int k,int f){
if(k<0) return 0;
if(n==2){
if(f==1) {
if(k<2) return 1;
}else{
if(k==0) return 2;
}
return 0;
}
int& ret = dp[n][k][f];
if(ret!=-1) return ret;
ret = 0;
if(f==0) ret += sol(n-1,k,1)+sol(n-1,k,0);
else ret += sol(n-1,k-1,1)+sol(n-1,k,0);
return ret;
}
int main(){
scanf("%d",&tc);
while(tc--){
scanf("%d%d",&N,&K);
memset(dp,-1,sizeof(dp));
printf("%d\n",sol(N+1,K,0));
}
}
github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/2698.cpp