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]);
}