코딩문제 풀이

11727번 2xn 타일링 2

student513 2020. 2. 7. 16:46

 

 

11727번: 2×n 타일링 2

첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.

www.acmicpc.net

DP문제를 연습하고 있다만 설명의 과정이 귀찮아 블로그에 기록하진 않았다.

 

이번 문제는 설명하기가 간단하고, DP의 핵심적인 부분을 다루고 있다.

 

블럭이 한 칸(2x1) 증가하는 경우와 두 칸(2x2)씩 증가하는 경우, 2가지를 상정한다.

 

이 때 두 칸씩 늘어나는 경우는 가로로 누운 블럭 두 개가 붙은 경우와 큰 하나의 블럭, 두 가지 블럭이다.

 

길이i 타일 = 길이가 i-1인 타일에 한 칸을 붙인 경우(경우의 수는 그대로) + 두 칸씩 늘어나는 경우*2(두 가지 블럭)

 

점화식으로 표현하면

 

DP[i] = DP[i-1] + DP[i-2]*2

 

#include <iostream>
using namespace std;
int arr[1001];
int main() {
	int n;
	cin >> n;
	arr[1] = 1; arr[2] = 3;
	for (int i = 3; i <= 1001; i++)
		arr[i] = (arr[i - 1] + arr[i - 2] * 2) % 10007;
	cout << arr[n] ;
	return 0;
}

 

'코딩문제 풀이' 카테고리의 다른 글

2225번 합분해  (0) 2020.02.11
4963번 섬의 개수  (0) 2020.02.10
13908번 비밀번호  (0) 2020.02.04
17144번 미세먼지 안녕!  (0) 2020.01.30
14891번 톱니바퀴  (0) 2020.01.21