문제 링크 : https://www.acmicpc.net/problem/11727
2×n 타일링 2 성공
문제2×n 직사각형을 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
예제 입력 12 예제 출력 13 예제 입력 28 예제 출력 2171 예제 입력 312 예제 출력 32731 |
[ 문제 풀이 ]
- D[n] = 2 x n 크기의 직사각형을 채우는 방법의 수라고 뒀을 때,
- N = 1일 때, 방법은 1가지이다. (D[1] = 1)
- N = 2일 때, 방법은 2가지이다. (D[2] = 3)
- N = n일 때, 방법은 (D[n] = D[n-1] + 2*D[n-2]) <-- ※ 이 문제의 경우는 동시에 일어나는 경우 곱해줘야 한다!
따라서, D[n-2] = D[n-1] + 2 * D[n-2] 이다.
[ 최종 구현(C++) ]
#include <stdio.h> #define MAX_NUMBER_SIZE 1002 int D[MAX_NUMBER_SIZE] = { 0 }; int main(void) { int N; scanf("%d", &N); D[1] = 1; D[2] = 3; for (register int i = 3; i <= N; i++) { D[i] = (D[i - 1] + (2 * D[i - 2])) % 10007; } printf("%d\n", D[N]); return 0; }
'Algorithm > 문제풀이' 카테고리의 다른 글
[주의][다이나믹 프로그래밍] 쉬운 계단 수 (0) | 2018.08.05 |
---|---|
[다이나믹 프로그래밍] 붕어빵 판매하기 (0) | 2018.08.04 |
[다이나믹 프로그래밍] 1, 2, 3 더하기 (0) | 2018.08.04 |
[주의][다이나믹 프로그래밍] 2×n 타일링 (0) | 2018.08.04 |
[다이나믹 프로그래밍] 1로 만들기 (0) | 2018.08.04 |