๋ฐฑ์ค€/Gold

[BOJ] 2225 : ํ•ฉ๋ถ„ํ•ด

Jaeguk 2022. 3. 2. 14:14
๋ฌธ์ œ ๋งํฌ

2225๋ฒˆ: ํ•ฉ๋ถ„ํ•ด (acmicpc.net)

 

2225๋ฒˆ: ํ•ฉ๋ถ„ํ•ด

์ฒซ์งธ ์ค„์— ๋‹ต์„ 1,000,000,000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

DP๋ฅผ ์ด์šฉํ•ด์„œ ์ˆซ์ž N์„ K๊ฐœ์˜ ์ˆซ์ž ์กฐํ•ฉ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ.

 

ํ’€์ด

DP[N][K] ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ DP[Y][X] ์—๋Š” ์ˆซ์ž Y๋ฅผ ์ˆซ์ž X๊ฐœ๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผ๊ฒ ๊ตฌ๋‚˜ ์ƒ๊ฐํ–ˆ๋‹ค.

์ผ๋‹จ Bottom-up ๋ฐฉ์‹์œผ๋กœ DP[0][1], DP[1][1], ... , DP[N][1], DP[0][2], DP[1][2], ... , DP[N][K] ์ด๋ ‡๊ฒŒ ์ฑ„์›Œ๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์€ ํ–ˆ์ง€๋งŒ, ์ ํ™”์‹์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•  ์ง€๊ฐ€ ๊ด€๊ฑด์ด๋‹ค.

์ฒ˜์Œ์—๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด DP[3][3]์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” DP[0][1] * DP[3][2] + DP[0][2] * DP[3][1] + DP[1][1] * DP[2][2] + DP[2][1] * DP[1][2] + DP[2][2] * DP[1][1] + DP[3][1] * DP[0][2] + DP[3][2] * DP[0][0] ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ๋ƒ๋ฉด 3์ด๋ผ๋Š” ์ˆซ์ž๋Š” 0 + 3, 1 + 2, 2 + 1, 3 + 0 ์ฒ˜๋Ÿผ 2๊ฐœ์˜ ์ˆ˜์˜ ๋ง์…ˆ์œผ๋กœ ํ‘œํ˜„๊ฐ€๋Šฅํ•œ๋ฐ K๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ 2๊ฐœ์˜ ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์ˆซ์ž์˜ ๊ฐœ์ˆ˜์˜ ํ•ฉ์ด K๊ฐœ๊ฐ€ ๋˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

1 + 2 ์˜ ์ƒํ™ฉ์„ ๋ดค์„ ๋•Œ 1์„ 1๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด 2๋Š” 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋งŒ๋“ค์–ด์•ผ 3์€ 3๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋‚˜์™”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•ž์˜ ์ ํ™”์‹์„ ์ƒ๊ฐํ•˜๊ฒŒ ๋๋Š”๋ฐ ์ €๋ ‡๊ฒŒ ํ–ˆ์„ ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋”ํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋‹ค๋ฅธ ์กฐํ•ฉ์ด๋ผ๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ๋ฐ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์„œ DP[2][2] * DP[1][1], DP[1][1] * DP[2][2] ์„ ๋ชจ๋‘ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.

DP[2][2] * DP[1][1] ์€ 2๋ฅผ 2๊ฐ€์ง€ ์ˆซ์ž๋ฅผ ์กฐํ•ฉํ•ด ๋งŒ๋“ค๊ณ  1์„ 1๊ฐ€์ง€ ์ˆซ์ž๋กœ ์กฐํ•ฉํ•ด ๋งŒ๋“ ๋‹ค๋Š” ๋œป์ธ๋ฐ

{(0,2), (1,1), (2,0)} * {1} ์˜ ๊ฒฝ์šฐ์ด๋‹ค 0 + 2 + 1, 1 + 1 + 1, 2 + 0 + 1 ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

DP[1][1] * DP[2][2] ์€ ์ˆœ์„ญ๋งŒ ๋ฐ”๊พผ ๊ฒฝ์šฐ์ธ๋ฐ 

{1} * {(0,2), (1,1), (2,0)} ์˜ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ 1 + 0 + 2, 1 + 1 + 1, 1 + 2 + 0 ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด 1+ 1 + 1์˜ ๊ฒฝ์šฐ๊ฐ€ ์ค‘๋ณต๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์ค‘๋ณต๋˜๋Š” ์กฐํ•ฉ์„ ์ฐพ์•„ ๋นผ์ฃผ๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์กฐํ•ฉ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ดค๋‹ค.

3์„ 3๊ฐ€์ง€ ์ˆซ์ž๋กœ ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๊ตฌํ•ด๋ณด์ž.

3 + 0 + 0     1 + 1 + 1    1 + 0 + 2    0 + 0 + 3

0 + 3 + 0     2 + 0 + 1    0 + 1 + 2

1 + 2 + 0     0 + 2 + 1

2 + 1 + 0

์ด๋ ‡๊ฒŒ ์ด 10๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋นจ๊ฐ„์ƒ‰ ๋ถ€๋ถ„์„ ์ž˜๋ณด๋ฉด ๊ฐ๊ฐ DP[3][2], DP[2][2], DP[1][2], DP[0][2] ์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ ํ™”์‹์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

DP[N][K] = DP[0][K-1] * DP[N][1] + DP[1][K-1] * DP[N-1][1] + ... + DP[N][K-1] * DP[0][1].

๊ทธ๋Ÿฐ๋ฐ DP[X][1] ์˜ ๊ฐ’์€ X ๊ฐ’์— ์ƒ๊ด€์—†์ด ๋ชจ๋‘ 1์ด๋ฏ€๋กœ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.

DP[N][K] = DP[0][K-1] + DP[1][K-1] + ... + DP[N][K-1] ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด ์ ํ™”์‹์„ ์‚ฌ์šฉํ•ด์„œ ํ’€๋ฉด ์ •๋‹ต์ด๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<intint>int>vector<pair<pair<intint>int>>, greater<pair<pair<intint>int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 200 + 5;
int N, K;
ll DP[MAX_N][MAX_N];
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> K;
    DP[0][0= 1;
    for (int i = 0; i <= N; i++) {
        DP[i][1= 1;
    }
    for (int i = 2; i <= K; i++) {
        for (int j = 0; j <= N; j++) {
            for (int p = 0; p <= j; p++) {
                DP[j][i] += DP[p][i - 1];
            }
            DP[j][i] %= 1000000000;
        }
    }
    cout << DP[N][K] << "\n";
    return 0;
}
cs

728x90