Algorithm/BOJ

정상 회담 2 - 1670

jhg0406 2020. 3. 8. 05:31
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
//1670 - 정상 회담 2
 
#include <iostream>
using namespace std;
 
#define MOD 987654321
 
int N;
long long cache[10001];
 
void init()
{
    cin >> N;
    for(int i = 0; i<=10000++i)
        cache[i] = -1;
    for(int i = 1; i<=10000; i += 2)
        cache[i] = 0;
    cache[0= cache[2= 1;
    cache[4= 2;
}
 
long long dp(int num)
{
    long long& ret = cache[num];
    if(ret != -1)
        return ret;
    ret = 0;
    int t = num -2;
    for(int i = 0; i<t/2; i += 2)
        ret += ((2*dp(i))%MOD)*dp(t-i)%MOD;
    ret += (dp(t/2)*dp(t/2));
    ret %= MOD;
    return ret;
}
 
int main()
{
    init();
    cout << dp(N);
}
cs

 

 

 

 

 

 

https://www.acmicpc.net/problem/1670

 

1670번: 정상 회담 2

첫째 줄에 정상 회담에 참가한 사람의 수 N이 주어진다. 이 값은 10,000보다 작거나 같은 짝수이다.

www.acmicpc.net

 

 

 

 

 

 

정상 회담 2

dp문제 입니다.

n명이 원탁에 있을 때, 기준 한명과 나머지 사람들이 악수하는 n-1의 경우로 나눌수 있습니다.

각각의 경우에 대해, 기준과 악수하는 사람을 경계로 2가지 부분문제를 만들수 있고, 부분문제의 곱을 구해 모든 경우에 대해 더하게 되면, n명이 원탁에 있을 때 겹치지 않게 악수나는 경우의수 입니다.

C(n) : n명이 안겹치게 악수할수 있는 경우의 수

C(n) = (0<= k < (n-2)/2)[2*C(k)*C(n-2-k)] + C((n-2)/2)*C((n-2)/2)