[BOJ] 2225 : ํฉ๋ถํด
๋ฌธ์ ๋งํฌ
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<int, int>, int>, vector<pair<pair<int, int>, int>>, greater<pair<pair<int, int>, 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 |