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

[λ°±μ€€] 2225번: ν•©λΆ„ν•΄ - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 2225번: ν•©λΆ„ν•΄ - C++

.23 2021. 8. 2. 00:19
문제

0λΆ€ν„° NκΉŒμ§€μ˜ μ •μˆ˜ K개λ₯Ό λ”ν•΄μ„œ κ·Έ 합이 N이 λ˜λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

λ§μ…ˆμ˜ μˆœμ„œκ°€ 바뀐 κ²½μš°λŠ” λ‹€λ₯Έ 경우둜 μ„Όλ‹€(1+2와 2+1은 μ„œλ‘œ λ‹€λ₯Έ 경우). λ˜ν•œ ν•œ 개의 수λ₯Ό μ—¬λŸ¬ 번 μ“Έ μˆ˜λ„ μžˆλ‹€.

 

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ N(1 ≤ N ≤ 200), K(1 ≤ K ≤ 200)κ°€ 주어진닀.

 

좜λ ₯

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


DPλ₯Ό μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제.

문제 이해λ₯Ό 잘λͺ»ν•΄μ„œ..(잘 λͺ»ν•΄μ„œ X, 잘λͺ» ν•΄μ„œ O) 고생을 많이 ν–ˆλ˜ λ¬Έμ œλ‹€..γ… γ… 

 

예제 μž…λ ₯으둜 주어진 20 2의 경우 20을 2개의 숫자둜 λ”ν•˜λŠ” 경우인

20 = 0 + 20 = 1 + 19 = 2 + 18 = 3 + 17 = ... = 19 + 1 = 20 + 0 의 경우λ₯Ό λͺ¨λ‘ λ”ν•˜μ—¬ 닡이 21이 λœλ‹€.

 

long long μžλ£Œν˜•μ˜ 2차원 λ°°μ—΄ arr[][]을 μ„ μ–Έν•΄μ€€λ‹€. arr[i][j]μ—λŠ” i번 λ”ν•˜μ—¬ jλ₯Ό λ§Œλ“€ 수 μžˆλŠ” 경우의 μˆ˜κ°€ λ“€μ–΄κ°„λ‹€. iκ°€ 1일 경우, 즉 jλ₯Ό ν•œλ²ˆλ§Œ λ”ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” 경우의 μˆ˜λŠ” j κ·Έ 자체 ν•œ 가지 λΏμ΄λ―€λ‘œ arr[1][j]λŠ” λͺ¨λ‘ 1둜 μ΄ˆκΈ°ν™”ν•΄μ€€λ‹€.

 

j = (j - m) + m (0 ≤ m ≤ j)인 점을 μ΄μš©ν•˜μ˜€μ„ λ•Œ, i번 λ”ν•˜μ—¬ jλ₯Ό λ§Œλ“€ 수 μžˆλŠ” κ²½μš°λŠ” (i - 1)번 λ”ν•˜μ—¬ m(λ˜λŠ” (j - m))을 λ§Œλ“€ 수 μžˆλŠ” 경우의 μˆ˜μ™€ κ°™κΈ° λ•Œλ¬Έμ—, 점화식은 λ‹€μŒκ³Ό 같은 μ‹μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

for(int i = 2; i <= k; i++) {
   for(int j = 0; j <= n; j++) {
       for(int m = 0; m <= j; m++) {
            arr[i][j] += arr[i - 1][m];
        }
    }
}

 

μ£Όμ˜ν•  점은..MOD(1,000,000,000)λ₯Ό μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— λ„£μ–΄ λ‚˜λ¨Έμ§€ 연산을 ν•΄μ•Όν•œλ‹€. 이걸둜 λ‘λ²ˆμ΄λ‚˜ ν‹€λ Έλ‹€.

전체 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MOD 1000000000

long long DP(int n, int k);

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

long long DP(int n, int k) {
    long long arr[201][201] = { 0 };
    
    for(int i = 0; i <= n; i++) {
        arr[1][i] = 1;
    }

    for(int i = 2; i <= k; i++) {
        for(int j = 0; j <= n; j++) {
            for(int m = 0; m <= j; m++) {
                arr[i][j] += arr[i - 1][m];
                arr[i][j] %= MOD;
            }
        }
    }
    return arr[k][n];
}
Comments