비대칭 타일링

Problem

https://www.algospot.com/judge/problem/read/ASYMTILING

Idea

2*1 로 만들 수 있는 총 경우의 수는..

int f(int n) {
    if (n <= 1) {
        return 1 
    }
    int ret = cache[n];

    if (ret != -1) {
        return ret;
    }
    ret = (f(n-1) + f(n-2)) % MOD;
    cache[n] = ret;
    return ret;
}

O(N): 부분 문제의 수는 O (n) 이고, 각각의 값을 계산하는 데는 O(1)

대칭을 제외한 비대칭 경우의 수는?

n이 홀수일 경우:
a) 가운데 21이 하나 있는 경우 1가지, n-1 은 서로 대칭 (다시 분할)

n 이 짝수일 경우:
b) 가운데 2
1 가 2개 경우와 n-2 는 서로 대칭 (다시 분할)
c) 전체의 반이 서로 대칭인경우. n / 2 (다시 분할)

int solution(int n) {
    if (n % 2 == 1) {
        return f(n) - f(n/2); // a)
    }
    int ret = f(d);
    ret = ret - f(n/2 -1); // b)
    ret = ret - f(n/2); // c)
    return ret;
}