Algorithm/백준

[백준][1904번] 01타일

1일1코딩 2020. 3. 29. 21:45

https://www.acmicpc.net/problem/1904

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰여진 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0타일을 두 개 붙인 한 쌍의 00타일들만이 남게 되었다. 그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수

www.acmicpc.net

사용언어 C++

 

풀이과정

 

00, 1을 사용하여 만들 수 있는 N자릿수 2진수 갯수를 찾는것이다.

 

dp[N] = N개의 이진수 갯수

 

EX)

N = 2라면 00, 11 2가지를 만들 수 있다.

N = 3이라면 100, 001, 111 3가지를 만들 수 있다.

 

N자리에 올 수 있는 값은 1 과 00을 생각해보면

XXX1 일 경우 XX11과 X001이 올 수 있다. dp[N] = dp[N-2] + dp[N-3] 이 된다.

XX00 일 경우 dp[N] = dp[N-2]가 된다.

따라서 dp[N] = dp[N-2] * 2 + dp[N -3] 과 같은 점화식을 구할 수 있었다.

 

소스코드

더보기
#include <stdio.h>
#define DIV 15746

int dp[1000001]; 

int main()
{
	int n;
	scanf("%d", &n);
	dp[1] = 1;
	dp[2] = 2;
	dp[3] = 3;
	for (int i = 4; i <= n; i++) {
		dp[i] = ((dp[i - 2] * 2) +  dp[i - 3]) % DIV;
	}
	printf("%d\n", dp[n]);
}