𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 11727번: 2×n 타일링 2 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 11727번: 2×n 타일링 2 - C++

.23 2021. 7. 13. 21:23
문제

2×n μ§μ‚¬κ°ν˜•μ„ 1×2, 2×1κ³Ό 2×2 νƒ€μΌλ‘œ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μ•„λž˜ 그림은 2×17 μ§μ‚¬κ°ν˜•μ„ μ±„μš΄ ν•œκ°€μ§€ μ˜ˆμ΄λ‹€.

 

μž…λ ₯

첫째 쀄에 n이 주어진닀. (1 ≤ n ≤ 1,000)

 

좜λ ₯

첫째 쀄에 2×n 크기의 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό 10,007둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

 


DPλ₯Ό μ΄μš©ν•˜μ—¬ ν‘ΈλŠ” 문제.

μ•žμ„œ ν’€μ—ˆλ˜ 11726번인 2xn 타일링을 쑰금만 μ‘μš©ν•˜λ©΄ λ°”λ‘œ ν’€ 수 μžˆλ‹€.

2xn λͺ¨μ–‘ μ§μ‚¬κ°ν˜•μ„ μ±„μšΈ 수 μžˆλŠ” 방법

κ°€λ‘œ ν•œ 칸을 1x2 νƒ€μΌλ‘œ μ±„μš°λŠ” 방법 ν•œ 가지, κ°€λ‘œ 두 칸을 2x1 타일을 μœ„μ•„λž˜λ‘œ μŒ“μ•„ μ±„μš°λŠ” 방법 ν•˜λ‚˜, 2x2 νƒ€μΌλ‘œ μ±„μš°λŠ” 방법 ν•˜λ‚˜μΈ 점을 κ³ λ €ν•˜μ—¬ 점화식을 μ„Έμš°λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

D[n] = D[n - 1] + 2 * D[n - 2]

 

이 문제 μ—­μ‹œ μ΄ˆκΈ°κ°’ μ„€μ •κ³Ό 맀 μ—°μ‚°λ§ˆλ‹€ 10007의 λ‚˜λ¨Έμ§€ 연산을 ν•΄μ£ΌλŠ” κ²ƒμ—λ§Œ μœ μ˜ν•˜μ—¬ ν’€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλ‹€.

λ¬Έμ œλŠ” top-down λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

μ½”λ“œ
#include <cstdio>
#include <vector>
#define MAX 1001

using namespace std;

vector<int> memo(MAX, 0);
int DP(int num);

int main(void) {
    int num;
    scanf("%d", &num);
    printf("%d\n", DP(num));
    return 0;
}

int DP(int num) {
    if(num < 2) return 1;
    if(memo[num] > 0) return memo[num];

    int result = (DP(num - 1) + 2 * DP(num - 2)) % 10007;
    memo[num] = result;
    return result;
}

 

Comments