4811번 : 알약
문제)
70세 박종수 할아버지는 매일 매일 약 반알을 먹는다. 손녀 선영이는 종수 할아버지에게 약이 N개 담긴 병을 선물로 주었다.
첫째 날에 종수는 병에서 약 하나를 꺼낸다. 그 다음, 그 약을 반으로 쪼개서 한 조각은 먹고, 다른 조각은 다시 병에 넣는다.
다음 날부터 종수는 병에서 약을 하나 꺼낸다. (약은 한 조각 전체 일 수도 있고, 쪼갠 반 조각 일 수도 있다) 반 조각이라면 그 약을 먹고, 아니라면 반을 쪼개서 한 조각을 먹고, 다른 조각은 다시 병에 넣는다.
종수는 손녀에게 한 조각을 꺼낸 날에는 W를, 반 조각을 꺼낸 날에는 H 보낸다. 손녀는 할아버지에게 받은 문자를 종이에 기록해 놓는다. 총 2N일이 지나면 길이가 2N인 문자열이 만들어지게 된다. 이때, 가능한 서로 다른 문자열의 개수는 총 몇 개일까?
입력 :
입력은 최대 1000개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄이며, 병에 들어있는 약의 개수 N ≤ 30 가 주어진다.
입력의 마지막 줄에는 0이 하나 주어진다.
출력 :
각 테스트 케이스에 대해서 가능한 문자열의 개수를 출력한다.
풀이)
알고리즘 중 하나인 카탈란 수를 구하는 문제라고 한다.
https://ko.wikipedia.org/wiki/%EC%B9%B4%ED%83%88%EB%9E%91_%EC%88%98
// 점화식을 이용한 풀이
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
|
// 4811. 알약
#include <iostream>
using namespace std;
int t, n;
long long dp[31];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i < 31; i++)
{
for (int j = 0; j < i; j++)
{
dp[i] += dp[j] * dp[i - j - 1];
}
}
while (true)
{
cin >> n;
if (n == 0) break;
cout << dp[n] << '\n';
}
return 0;
}
|
cs |
// 탑다운 방식
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
// 4811. 알약
#include <iostream>
using namespace std;
int t, n;
long long dp[32][32];
long long recur(int cur, int cnt)
{
if (cur == 0 && cnt == 0)
{
return 1;
}
long long ret = 0;
if (dp[cur][cnt] != -1)
{
return dp[cur][cnt];
}
if (cur > 0)
{
if (cnt > 0) ret += recur(cur, cnt - 1);
ret += recur(cur - 1, cnt + 1);
}
else if (cur == 0 && cnt > 0)
{
ret += recur(cur, cnt - 1);
}
dp[cur][cnt] = ret;
return ret;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
fill(&dp[0][0], &dp[31][32], -1);
while (true)
{
cin >> n;
if (!n) break;
cout << recur(n, 0) << '\n';
}
return 0;
}
|
cs |
출처 : https://www.acmicpc.net/problem/4811
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 15886번 : 내 선물을 받아줘 2 (C++) (0) | 2023.09.14 |
---|---|
[백준] 21939번 : 문제 추천 시스템 Version 1 (C++) (0) | 2023.09.13 |
[백준] 5568번 : 카드 놓기 (C++) (0) | 2023.09.13 |
[백준] 16174번 : 점프왕 쩰리 (Large) (C++) (0) | 2023.09.12 |
[백준] 6987번 : 월드컵 (C++) (0) | 2023.09.12 |