백준: 타일 채우기, 타일링 ②(14852, 11333, 2718)

2 분 소요


타일링 이어서

14852: 타일 채우기 3

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

문제: 2*N 크기 벽을 2*1, 1*2, 1*1 타일로 채우는 경우의 수

1
이번엔 1*1 타일이 추가 되었다.
적당히 나눠 주면 된다

2
1번 경우에서 처음에 이런 식으로 나눴더니, 겹치는 경우가 막 생겨서 상당히 곤란했다

#include <bits/stdc++.h>
#define MOD 1000000007

using namespace std;

long long dp[1000001];
long long dp2[1000001];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;

    dp[0] = 1;
    dp[1] = 2;
    dp2[1] = 1;
    for(int i = 2; i <= n; i++){
        dp[i] = 2l * dp2[i-1] + 2l * dp[i-1] + dp[i-2];
        dp2[i] = dp[i-1] + dp2[i-1];
        dp[i] = dp[i] % MOD;
        dp2[i] = dp2[i] % MOD;
    }

    cout << dp[n] << endl;

}

이 문제는 모듈러 해주는 걸 잊으면 안 된다

dp[i] = (((2 * dp2[i-1]) % MOD + (2 * dp[i-1]) % MOD) % MOD + dp[i-2]) % MOD;
dp2[i] = (dp[i-1] + dp2[i-1]) % MOD;

long long 타입을 안 쓰고 int로 배열을 선언해서 MOD를 자주 해주는 방식으로도 한 번 제출해 봤다

3
시간은 별 차이 없고 메모리는 확실히 줄어든다.


11333: 4×n 타일링

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

문제: 4*N 크기 벽을 3*1, 1*3 타일로 채우는 경우의 수

4
얘도 적당히 안 겹치게 잘 짠다. 근데 짜다 보니까 점화식이 3개나 필요하게 됐다.
다른 애들은 골드 5고 얘는 골드 2던데 그래서 그런 건지?? 아니면 줄일 수 있을랑가

#include <bits/stdc++.h>
#define MOD 1000000007

using namespace std;

long long dp[10001];
long long dp2[10001];
long long dp3[10001];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int t;
    cin >> t;

    dp[0] = 1;
    dp[3] = 3;
    dp2[2] = 1;
    dp3[1] = 1;
    for(int i = 3; i <= 10000; i++){
        dp[i] = 2 * dp2[i-1] + dp[i-3];
        dp2[i] = dp2[i-3] + dp3[i-1];
        dp3[i] = dp[i-1] + dp3[i-3];
        dp[i] = dp[i] % MOD;
        dp2[i] = dp2[i] % MOD;
        dp3[i] = dp3[i] % MOD;
    }

    while( t-- ){
        int n;
        cin >> n;
        cout << dp[n] << '\n';
    }

}

얘도 뭐 모듈러 잘 해주고 여러 개 받아서 출력하면 끝


2718: 타일 채우기

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

문제: 4*N 크기 벽을 2*1, 1*2 타일로 채우는 경우의 수

5
식이 4개 나온다 얘는 골드 1이다ㅋㅋ 이거 맞는 건가
그래도 식 자체는 간단한 편

#include <bits/stdc++.h>

using namespace std;

int dp[27];
int dp2[27];
int dp3[27];
int dp4[27];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int t;
    cin >> t;

    dp[0] = 1; dp[1] = 1; dp[2] = 5;
    dp2[0] = 1; dp2[1] = 1; dp2[2] = 2;
    dp3[0] = 1; dp3[1] = 0; dp3[2] = 2;
    dp4[0] = 1; dp4[1] = 1; dp4[2] = 1;
    for(int i = 3; i <= 26; i++){
        dp4[i] = dp[i-1] + dp4[i-2];
        dp3[i] = dp2[i-1] + dp[i-2] + dp4[i-1];
        dp2[i] = dp[i-1] + dp2[i-1];
        dp[i]  = dp2[i] + dp3[i];
    }

    while( t-- ){
        int n;
        cin >> n;
        cout << dp[n] << '\n';
    }

}

정확한 N은 말해주지 않지만 Int 범위 내에서 문제가 나온다는데, N이 대략 24? 25일 때쯤에 오버플로우나더라


좋다

댓글남기기