백준

[백준 BOJ 11727번] 2×n 타일링 2 (C++ )

후니_ 2021. 2. 17. 00:15
반응형

문제

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.

아래 그림은 2×17 직사각형을 채운 한가지 예이다.

 

입력

첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

출력

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

 

예제 입력 1

2

예제 출력 1

3

예제 입력 2

8

예제 출력 2

171

예제 입력 3

12

예제 출력 3

2731

 

풀이

간단한 다이나믹 프로그래밍 문제이다. 

노가다를 해서 깂의 갯수를 세어보면 일정한 규칙이 보이는데, 현재 인덱스를 기준으로 -1인덱스의 값을 2로 곱해 준 후에 방금 곱해준 값에서 현재 인덱스가 짝수일 시 +1, 홀수일 시 -1을 각각 더해줌을 알 수 있다.

따라서

1
2
3
4
5
6
7
//현재 인덱스가 짝수일 때
 
dp[i] = dp[i-1]*2 + 1;
 
//현재 인덱스가 홀수일 때
 
dp[i] = dp[i-1]*2 - 1;
cs

 

라는 점화식이 성립됨을 알 수 있다.

나머지는 딱히 머리를 쓸 필요가 없는 문제이다.

10007을 나눈 나머지를 출력해야한다는 것만 잊지 않는다면 말이다.

코드

1
2
3
4
5
6
7
8
9
10
11
// 2×n 타일링 2
// 다이나믹 프로그래밍
#include <iostream>
int dp[1001]={0,1};
int main(){
    int n;
    std::cin>>n;
    for(int i=2;i<=1000;i++)
        dp[i]=(dp[i-1]*2+(i%2?-1:1))%10007;
    std::cout<<dp[n];
}
cs

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

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

 

반응형