알고리즘/백준 단계별로 풀기 (12.26 ~ 12.31)

다이나믹프로그래밍1 - 백준 1904번 01타일

잡담연구소 2020. 12. 27. 10:23

www.acmicpc.net/problem/1904

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이

www.acmicpc.net

IDEA

규칙만 찾으면 된다. 써보자 

N = 1 1개  1 

N = 2 2개  00 , 11

N = 3 3개 100 , 001, 111

N = 4 5개 1100 , 1001 , 0011, 0000, 1111

dp[n] = dp[n-1] + dp[n-2] (n > 2) 라는 점화식을 세울 수 있다. 

그 후 문제의 조건에 맞게 15746으로 항상 나눠주면 된다. 

 

코드 

#include <iostream>
#include <vector>
using namespace std;
int dp[1000001] = {0};
int main() {
	int n;
	scanf("%d", &n);
	dp[1] = 1;
	dp[2] = 2;
	for (int i = 3; i <= n; i++) {
		dp[i] = (dp[i - 1] % 15746 + dp[i - 2] % 15746) % 15746;
	}
	printf("%d", dp[n]);
}