반응형
문제
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×17 직사각형을 채운 한가지 예이다.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
풀이
해당 문제는 지난번 포스팅한 2*N 타일링 문제와 동일한 DP 문제이다.
단 2*2 타일이 추가 되므로 하나만 더 고려해주면 되는데
N번째 타일 인 경우 DP(N-2) 값을 더해주면 되었는데 +2인 경우에는 2가지 경우의 수가 있으므로 *2를 해주어야 한다
즉 DP(N) = DP(N-1) + DP(N-2)*2의 형태가 된다.
#include<iostream>
using namespace std;
int main() {
/*
맨 마지막에 2칸 또는 1칸을 사용한다.
1 2 1 2 1 2 ...
.....1 2
1) 1 : 1가지
2) 1 + 1 , 2 (2*1, 2*2) : 3가지
3) 1 + 1 + 1 , 2(2*1, 2*2) + 1 , 1 + 2(2*1, 2*2) : 5가지
4) 1 + 1 + 1 + 1 , 1 + 2 + 1 , 2 + 1 + 1 (=dp(4)) | 1 + 1 + 2 , 2 + 2 (=dp(2)),
i) i - 1 + 1 , i - 2 + 2
n) n - 1 + 1 , n - 2 + 2
but 2에는 2*2 일 수도 있고 2*1 일 수도 있다.
*/
//int Numarray[1001];
int kindarray[1001];
int Num;
cin >> Num;
kindarray[1] = 1;
kindarray[2] = 3;
for (int i = 3; i <= Num; i++) {
kindarray[i] = (kindarray[i - 1] + (kindarray[i - 2]*2))%10007;
}
cout << kindarray[Num] << endl;
}
끝
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
[백준 알고리즘] 2839번 설탕 배달 (0) | 2020.08.27 |
---|---|
[백준 알고리즘] 9461번 파도반 수열 (0) | 2020.08.26 |
[백준 알고리즘] 1912번 연속합 (0) | 2020.08.26 |
[백준 알고리즘] 2156번 포도주 시식 (0) | 2020.08.25 |
[백준 알고리즘] 14502번 연구소 (0) | 2020.08.11 |
댓글