반응형
문제
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
반응형
'백준' 카테고리의 다른 글
[백준 BOJ 9655번] 돌 게임 (C++ ) [DP, 다이나믹 프로그래밍] (0) | 2021.03.06 |
---|---|
[백준 BOJ 11725번] 트리의 부모 찾기 (C++ ) [트리/DFS/BFS] (0) | 2021.03.05 |
[백준 BOJ 10816번] 숫자 카드 2 (C / C++ ) (0) | 2021.03.04 |
[백준 BOJ 4963번] 섬의 개수 (C++ ) (BFS/DFS) (0) | 2021.02.28 |
[백준 BOJ 11723번] 집합 (C/C++ ) [비트마스킹] (0) | 2021.02.28 |