https://www.acmicpc.net/problem/2133

 

2133번: 타일 채우기

문제 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. 입력 첫째 줄에 N(1 ≤ N ≤ 30)이 주어진다. 출력 첫째 줄에 경우의 수를 출력한다. 예제 입력 1 복사 2 예제 출력 1 복사 3 힌트 아래 그림은 3×12 벽을 타일로 채운 예시이다....

www.acmicpc.net

5항까지 수기계산하고 규칙찾는데 규칙이 5~6개는 나왔다.

 

6항부터는 수기계산이 힘들어서 그냥 채점 박치기 했다. 

 

이런거 대회문제에 나오면 시간 진짜 많이 잡아먹힐거 같다.

 

더보기
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int n;
    cin >> n;
    if (n % 2 == 1) {
        cout << 0;
        return 0;
    }
    n /= 2;
    vector<unsigned long long> arr;
    vector<unsigned long long> m;
    arr.resize(n + 1);
    m.resize(n + 3);
    arr[0] = 1;
    arr[1] = 3;
    m[0] = 1;
    m[1] = 1;
    m[2] = 1;
    for (int i = 3; i <= n; i++) {
        m[i] = m[i - 1] + m[i - 2] + 1;
    }
    for (int i = 2; i <= n; i++) {
        //arr[i] = (arr[i - 1] + arr[i - 2]) * 3 - m[i - 1];
        arr[i] = arr[i - 1] * 3 + (arr[i - 1] - arr[i - 2]);
    }
    cout << arr[n];
    return 0;
}