본문 바로가기

Study/Algorithm

[동적계획법] 8. 타일링 방법의 수

 

https://algospot.com/judge/problem/read/TILING2

 

algospot.com :: TILING2

타일링 문제 정보 문제 2xn 크기의 사각형을 2x1 크기의 사각형으로 빈틈없이 채우는 경우의 수를 구하는 프로그램을 작성하세요. 예를 들어 n=5라고 하면 다음 그림과 같이 여덟 가지의 방법이 있습니다. 경우의 수는 n이 커지면 아주 커질 수 있으므로, 1000000007으로 나눈 값을 대신 출력하세요. 입력 입력의 첫 줄에는 테스트 케이스의 수(C <= 50)가 주어집니다. 그후 C줄에 각각 1개의 자연수로 n(1 <= n <= 100)이 주어집니다.

algospot.com

 

컨셉

점화식

tiling(from,end) //from부터 end까지 채우는 방법의 수

tiling(from, end) = tiling(from +1, end) + tiling(from+2, end);  //end는 다 똑같으니까 parameter에서 빼도 된다.

 

 

초안

내 코드(정답, 0ms)

...더보기
/**
 * @name    8.10. 타일링2
 * @ID      TILING2
 * @date    2019-08-08
 * @author  Sunmon
 */

#include <iostream>
#include <cstring>
using namespace std;

const int MOD = 1000000007;
int cache[100+1];
int N;
int tiling(int n)
{
    if(n<=1) return 1;
    int& ret = cache[n];
    if(ret != -1) return ret;

    return ret = ((tiling(n-1) + tiling(n-2)) % MOD);
}

int main()
{
    int C;
    cin >> C;
    while(C--)
    {
        memset(cache, -1, sizeof(cache));
        cin >> N;
        cout << tiling(N) << endl;
    }
}

 

주의

(a+b)%k == (a%k + b%k) %k