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

[λ°±μ€€] 10844번: μ‰¬μš΄ κ³„λ‹¨μˆ˜ - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 10844번: μ‰¬μš΄ κ³„λ‹¨μˆ˜ - C++

.23 2021. 7. 19. 16:32
문제

45656μ΄λž€ 수λ₯Ό 보자.

이 μˆ˜λŠ” μΈμ ‘ν•œ λͺ¨λ“  자리수의 차이가 1이 λ‚œλ‹€. 이런 수λ₯Ό 계단 수라고 ν•œλ‹€.

μ„Έμ€€μ΄λŠ” 수의 길이가 N인 계단 μˆ˜κ°€ λͺ‡ 개 μžˆλŠ”μ§€ κΆκΈˆν•΄μ‘Œλ‹€.

N이 μ£Όμ–΄μ§ˆ λ•Œ, 길이가 N인 계단 μˆ˜κ°€ 총 λͺ‡ 개 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. (0으둜 μ‹œμž‘ν•˜λŠ” μˆ˜λŠ” μ—†λ‹€.)

 

μž…λ ₯

첫째 쀄에 N이 주어진닀. N은 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 정닡을 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.


DPλ₯Ό μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제. 문제 이름은 μ‰¬μš΄ κ³„λ‹¨μˆ˜μΈλ° ν•˜λ‚˜λ„ μ•ˆμ‰½λ‹€.

N = 1μΌλ•ŒλŠ” 1λΆ€ν„° 9κΉŒμ§€(0은 ν¬ν•¨ν•˜μ§€ μ•ŠμŒ) 9가지고,

N = 2μΌλ•ŒλŠ” { 10, 12, 21, 23, 32, 34, ... , 89, 98 } (90은 κ³„λ‹¨μˆ˜κ°€ μ•„λ‹˜)κΉŒμ§€ 17가지가 λ‚˜μ˜¨λ‹€.

N = 3μΌλ•ŒλŠ” { 101, 121, 123, 210, 212, ... } 등이 κ°€λŠ₯ν•  것이닀. μ—¬κΈ°μ„œλΆ€ν„° κ·œμΉ™μ΄ 보이기 μ‹œμž‘ν•œλ‹€.

 

예λ₯Ό λ“€μ–΄ μžλ¦¬μˆ˜κ°€ 3이고 3번째 자리수의 μžλ¦Ώκ°’μ΄ 2μΌλ•Œ κ°€λŠ₯ν•œ κ³„λ‹¨μˆ˜λŠ” { 210, 212, 231, 232 } 이닀. 이 λ•Œ κ³„λ‹¨μˆ˜μ˜ κ°œμˆ˜λŠ” 2번째 μžλ¦Ώκ°’μ΄ 1 { 10, 12 } κ³Ό 3 { 31, 32 } μΌλ•Œμ˜ κ³„λ‹¨μˆ˜μ˜ ν•©κ³Ό κ°™λ‹€. 이와 같은 κ·œμΉ™μ„ μ­‰ 따라가면 μžλ¦¬μˆ˜λŠ” n이고 kλŠ” 0λΆ€ν„° 9κΉŒμ§€μ˜ 인덱슀라 ν•  λ•Œ, 점화식은 λ‹€μŒκ³Ό κ°™λ‹€.

 

D[n][k] = D[n - 1][k - 1] + D[n - 1][k + 1]

 

μ—¬κΈ°μ„œ μΆ”κ°€μ μœΌλ‘œ 생각해야될 μ˜ˆμ™Έκ°€ μžˆλŠ”λ°, λ°”λ‘œ 0κ³Ό 9이닀.

인덱슀 0의 κ²½μš°μ—λŠ” λ‹€μŒ μžλ¦¬μ— 1만 μ˜€λŠ” 것이 κ°€λŠ₯ν•˜κ³ , 9일 λ•ŒλŠ” 8만 μ˜€λŠ” 것이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό κ³ λ €ν•œ μ΅œμ’…μ μΈ 점화식은 λ‹€μŒκ³Ό κ°™λ‹€.

 

D[n][0] = D[n - 1][1]

D[n][k] = D[n - 1][k - 1] + D[n - 1][k + 1] (0 < k < 9)

D[n][9] = D[n - 1][8]

 

각 μžλ¦Ώκ°’λ§ˆλ‹€μ˜ 경우의 μˆ˜κ°€ λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ— μ΅œμ’…μ μœΌλ‘œλŠ” D[n]의 0λΆ€ν„° 9κΉŒμ§€μ˜ 값을 더해주면 λœλ‹€. 이 λ•Œ 값이 크기 λ•Œλ¬Έμ— μ—°μ‚°λ§ˆλ‹€ 1,000,000,000을 λ‚˜λˆ μ€˜μ•Όν•œλ‹€. λ¬Έμ œλŠ” Bottom-up λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

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

long DP(int num);
long Step[MAX][10] = { 0 };

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

long DP(int num) {
    for(int i = 1; i < 10; i++) {
        Step[1][i] = 1;
    }
    
    for(int i = 2; i <= num; i++) {
        Step[i][0] = Step[i - 1][1] % 1000000000;
        for(int j = 1; j < 9; j++) {
            Step[i][j] = (Step[i - 1][j - 1] + Step[i - 1][j + 1]) % 1000000000;
        }
        Step[i][9] = Step[i - 1][8] % 1000000000;
    }

    long sum = 0;
    for(int i = 0; i < 10; i++) {
        sum += Step[num][i];
        sum %= 1000000000;
    }

    return sum;
}
Comments