[백준/BOJ] 백준 2133번 : 타일 채우기
2022. 8. 13. 17:26ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/2133
다이나믹 프로그래밍을 통해 너비가 width인 타일(3*width)을 채우기 위한 경우의 수를 구하는 방법으로 문제를 해결했다. 이때 맨 처음 너비가 2인 블록으로 채우는 경우부터 2씩 증가하여 맨 처음 너비가 width인 블록으로 채우는 경우를 계산하여 문제를 해결했다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<int> cache(35, -1);
int Solve(int width)
{
//너비가 홀수일때는 채울 수 없음
if (width % 2 == 1)
return 0;
//모든 블록을 다 채웠을때
if (width == 0)
return 1;
//너비가 2일때는 방법이 3개
if (width == 2)
return 3;
int& ret = cache[width];
if (ret != -1)
return ret;
ret = 0;
for (int i = 2; i <= width; i = i + 2)
{
//맨 처음을 너비 2짜리 블록으로 채울 경우
if (i == 2)
{
ret += (3 * Solve(width - i));
continue;
}
//맨 처음을 너비 i짜리 블록으로 채울 경우
//너비 i짜리 블록의 유니크한 가짓수는 2가지
//(너비 i짜리 블록의 유니크한 가짓수가 아닌 경우는 이전에 (i 이하 너비)에서 처리 된다)
ret += (2 * Solve(width - i));
}
return ret;
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n;
cout << Solve(n);
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 19649번 : 미담 전하기 (0) | 2022.08.14 |
---|---|
[백준/BOJ] 백준 1014번 : 컨닝 (0) | 2022.08.13 |
[백준/BOJ] 백준 13141번 : Ignition (0) | 2022.02.07 |
[백준/BOJ] 백준 10227번 : 삶의 질 (0) | 2022.02.07 |
[백준/BOJ] 백준 16347번 : Alloc (0) | 2022.02.07 |