https://www.acmicpc.net/problem/11727
11727번: 2×n 타일링 2
2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.
www.acmicpc.net
11726번 문제와 비슷한 문제로, 2 x n 직사각형을 그림으로 그려 보면,
2 x 1 하나를 놓으면 나머지는 2 x (n-1) 으로 채운것과 같고, 2 x 2 의 사각형 하나와 1 x 2 사각형 두개를 놓으면 2 x (n-2) 로 채운 그림과 같다.
그래서 dp[i] = dp[i-1] + (dp[i-2]*2) 식이 만들어진다. 이렇게 만들어진 수는 기하급수적으로 커지므로 10007으로 나눈 나머지를 출력한다.
코드
//11727
#include <iostream>
#include <cstring>
using namespace std;
#define SIZE 1001
int main(int argc, const char * argv[]) {
cin.tie(NULL);
ios::sync_with_stdio(0);
int dp[SIZE];
int num;
cin >> num;
dp[0] = 0;
dp[1] = 1;
dp[2] = 3;
for(int i=3;i<=SIZE;i++){
dp[i] = ( dp[i-1] + (dp[i-2]*2) ) % 10007;
}
cout << dp[num];
return 0;
}
'코딩테스트 연습 > Baekjoon' 카테고리의 다른 글
[Baekjoon] 14002번: 가장 긴 증가하는 부분 수열 4 / dynamic (0) | 2022.03.31 |
---|---|
[Baekjoon] 1309번: 동물원 / dynamic (0) | 2022.03.31 |
[Baekjoon] 11726번: 2xn 타일링 / dynamic (0) | 2022.03.31 |
[Baekjoon] 1149번: RGB거리 / dynamic (0) | 2022.03.31 |
[Baekjoon] 11057번: 오르막 수 / dynamic (0) | 2022.03.31 |