Algorithm/알고스팟

algospot - asymtiling

jhg0406 2020. 2. 3. 19:27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//algospot - asymtiling
 
#include <iostream>
#include <vector>
using namespace std;
 
#define MOD 1000000007
 
int N;
//cache[size] : size 크기만큼의 타일을 채울수 있는 경우의 수
vector<int> cache;
 
void init()
{
    cin >> N;
    cache = vector<int>(N + 1-1);
}
 
//dp[idx] = dp[idx-1] + dp[idx-2]
//dp[1] = 1, dp[2] = 2
int dp(int idx)
{
    if (idx == 1)
        return 1;
    else if (idx == 2)
        return 2;
    int &ret = cache[idx];
    if (ret != -1)
        return ret;
    ret = dp(idx - 1+ dp(idx - 2);
    ret %= MOD;
    return ret;
}
 
int main()
{
    int C;
    cin >> C;
    for (int tn = 0; tn < C; ++tn)
    {
        init();
        if (N == 2)
            cout << 0 << "\n";
        else if (N % 2)
            cout << (dp(N) - dp(N / 2+ MOD) % MOD << "\n";
        else
            cout << (((dp(N) - dp(N / 2 - 1)+MOD) % MOD) - dp(N / 2+ MOD) % MOD << "\n";
    }
}
cs

 

 

 

 

 

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

 

algospot.com :: ASYMTILING

비대칭 타일링 문제 정보 문제 그림과 같이 2 * n 크기의 직사각형을 2 * 1 크기의 타일로 채우려고 합니다. 타일들은 서로 겹쳐서는 안 되고, 90도로 회전해서 쓸 수 있습니다. 단 이 타일링 방법은 좌우 대칭이어서는 안 됩니다. 위 그림은 2 * 5 크기의 직사각형을 채우는 비대칭 타일링 방법 6가지를 보여줍니다. 다음의 2가지는 좌우대칭이기 때문에 세지 않습니다. n 이 주어질 때 가능한 비대칭 타일링 방법의 수를 계산하는 프로그램을 작성하세요.

www.algospot.com

 

 

 

 

 

ASYMTILING

2xN 크기의 직사각형 채우는 경우의수 - 2xN 크기의 직사각형중 대칭인 경우의수