백준 온라인 저지

백준 2133: 타일 채우기

dev_doyle 2018. 7. 10. 02:26

조오금 까다로운 문제다. 강의노트가 없었다면 아마 꽤 시간을 많이 걸렸거나 못 풀었을 것 같다. 아이디어만 캐치하면 코딩자체는 심플하고 쉽다. i가 i번째에서의 블록 개수라고 하면 i-2 에서 블록 3개를 가지고 i와 i-2사이의 3x2공간을 채우는 경우를 생각해보면 3가지 경우가 있고 점화식이 생각난다. 하지만 여기서 끝이 아니라 i - 4, i - 6, .. 계속 나아가 심지어 0일 때 조차도 블록을 쌓을 수 있는 경우가 있는데 블록들을 2층으로 쭉 쌓고 그 부분을 감싸는 형태의 모습이다. 이 블록은 2칸 마다 새로운 형태의 블록이기 때문에 따로 점화식을 세워줘야 한다.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
long long d[50];
//n은 짝수일 수 밖에 없다.
int main()
{
    int input = 0;
    std::cin >> input;
    d[0= 1;
    for (int i = 2; i <= input; i = i + 2)
    {
        d[i] = d[i - 2* 3;
        for (int j = 4; j <= i; j = j + 2)
        {
            d[i] += d[i - j] * 2;
        }
    }
    std::cout << d[input] << std::endl;
    return 0;
}
cs