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

[λ°±μ€€] 11057번: 였λ₯΄λ§‰ 수 - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 11057번: 였λ₯΄λ§‰ 수 - C++

.23 2021. 7. 20. 15:31
문제

였λ₯΄λ§‰ μˆ˜λŠ” 수의 μžλ¦¬κ°€ μ˜€λ¦„μ°¨μˆœμ„ μ΄λ£¨λŠ” 수λ₯Ό λ§ν•œλ‹€. μ΄λ•Œ, μΈμ ‘ν•œ μˆ˜κ°€ 같아도 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μΉœλ‹€.

예λ₯Ό λ“€μ–΄, 2234와 3678, 11119λŠ” 였λ₯΄λ§‰ μˆ˜μ΄μ§€λ§Œ, 2232, 3676, 91111은 였λ₯΄λ§‰ μˆ˜κ°€ μ•„λ‹ˆλ‹€.

수의 길이 N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 였λ₯΄λ§‰ 수의 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μˆ˜λŠ” 0으둜 μ‹œμž‘ν•  수 μžˆλ‹€.

 

μž…λ ₯

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

 

좜λ ₯

첫째 쀄에 길이가 N인 였λ₯΄λ§‰ 수의 개수λ₯Ό 10,007둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό μΆœλ ₯ν•œλ‹€.


DPλ₯Ό μ‚¬μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제. μ•žμ„œ ν’€μ—ˆλ˜ 10844번 μ‰¬μš΄ κ³„λ‹¨μˆ˜ λ¬Έμ œμ™€ λΉ„μŠ·ν•˜λ‹€.

 

N = 1 μΌλ•ŒλŠ” 0λΆ€ν„° 9κΉŒμ§€(μˆ˜λŠ” 0으둜 μ‹œμž‘ν•  수 있음) 10가지이고,

N = 2 μΌλ•ŒλŠ” { 00, 01, ..., 11, 12, 13, .. , 89, 99 } 둜 55가지이닀.

각 자리수의 μžλ¦¬κ°’λ“€μ€ μžμ‹ λ³΄λ‹€ μ•žμ— μžˆλŠ” 자리수의 μžλ¦¬κ°’λ³΄λ‹€ 값이 κ°™κ±°λ‚˜ 큰 μˆ«μžλ“€λ‘œ κ΅¬μ„±λ˜λ©΄ 그만이기 λ•Œλ¬Έμ—, D[n][i]λ₯Ό ꡬ할 λ•ŒλŠ” D[n - 1][i], D[n - 1][i + 1], ... , D[n - 1][8], D[n - 1][9] κΉŒμ§€ λͺ¨λ‘ 더해주면 λœλ‹€.

 

n이 1, 즉 ν•œ 자리수의 κ²½μš°μ—λŠ” D[1][j]의 값을 λͺ¨λ‘ 1둜 μ΄ˆκΈ°ν™”ν•΄μ£Όκ³ , jκ°€ 2 이상인 경우의 점화식은 λ‹€μŒκ³Ό κ°™λ‹€.

 

D[n][j] += D[n - 1][k] (0 ≤ j < 10, j k < 10)

 

μ—°μ‚°λ§ˆλ‹€ 10007둜 λ‚˜λˆ„μ–΄μ€˜μ•Ό λœλ‹€λŠ” λΆ€λΆ„λ§Œ 빼먹지 μ•ŠμœΌλ©΄ 10844λ²ˆλ³΄λ‹€ 더 μ‰½κ²Œ ν’€ 수 μžˆλ‹€. λ¬Έμ œλŠ” Bottom-up λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

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

int DP(int num);

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

int DP(int num) {
    int Step[MAX][10] = { 0 };
    for(int i = 0; i < 10; i++) {
        Step[1][i] = 1;
    }

    for(int i = 2; i <= num; i++) {
        for(int j = 0; j < 10; j++) {
            for(int k = j; k < 10; k++) {
                Step[i][j] += Step[i - 1][k] % 10007;
                Step[i][j] %= 10007;
            }
        }
    }

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

    return sum;
}
Comments