※ 웹 환경에 최적화된 서식이므로 웹 페이지로 열람함을 권장.
타일링 방법의 수 세기(링크)
완전 탐색으로 생각한 후 메모이제이션을 적용하자. 각 작업 조각마다 2 x n 사각형의 맨 왼쪽 세로줄을 덮어 나간다. 맨 왼쪽 세로줄을 덮는 방법은 타일 하나를 세워서 놓거나, 두 개의 타일을 가로로 놓으면 된다.
타일 하나를 세워서 놓으면 가로의 길이가 n - 1 인 사각형이 남고 두 개의 타일을 가로로 놓으면 가로의 길이가 n - 2 인 사각형이 남는다.
2 x 2 인 사각형을 생각해보면 타일 하나를 세워 놓으면 2 x 1 인 사각형이 남고 타일 두개를 놓으면 사각형이 모두 채워진다.
따라서, 가로 길이가 1 혹은 0 인 경우에 (세로 타일 한 개를 놓으면 되거나 이미 사각형을 모두 채웠으므로 사각형을 채운 1 가지 방법으로 친다.) 사각형을 채운 방법 1 가지를 찾은 것이므로 1을 반환한다.
const int MOD = 1000000007;
int cache[101];
int tiling(int n) {
if (n <= 1) return 1;
int& ret = cache[n];
if (ret != -1) return ret;
return ret = (tiling(n - 2) + tiling(n - 1)) % MOD;
}
'문제 해결 알고리즘 기초 > 동적 계획' 카테고리의 다른 글
[알고스팟] Triangle Path 문제의 경로 개수 세기 - 동적 계획 (0) | 2021.05.24 |
---|---|
[알고스팟] 원주율 외우기 - 동적 계획, 최적 부분 구조 (0) | 2021.05.07 |
최적해 문제를 동적 계획법으로 구하는 순서 (0) | 2021.05.04 |
[알고스팟] 최대 증가 부분 수열 - 동적 계획, 최적해, 최적 부분 구조 (0) | 2021.05.04 |
동적 계획과 최적화 문제, Triangle Path(알고스팟) (0) | 2021.04.27 |