백준 16468번 크리스마스 트리 꾸미기
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
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const long long MAX = 100030001;
int n, l;
long long dp[301][301];
 
long long F(int l, int n) {
    if (n == 0return 1;
    if (l == 0return 0;
    long long &ret = dp[l][n];
 
    if (ret != -1return ret;
 
    ret = 0;
    for (int i = 0; i < n; i++) {
        //루트제외 왼쪽트리 오른쪽트리의 개수나눈경우 더하기.
        ret += (F(l - 1, i)*F(l - 1, n - 1 - i));
        ret %= MAX;
    }
    return ret=dp[l][n];
}
 
int main(void) {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> l;
    memset(dp, -1sizeof(dp));
 
    cout <<(F(l, n)- F(l-1,n)+ MAX )%MAX;
 
    return 0;
}
cs

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



F(l-1,n) = { 볼 N개로 만들 수 있는 트리의 높이가 1,2,...,L-1인 경우의 수}

F(l,n) = { 볼 N개로 만들 수 있는 트리의 높이가 1,2,...,L인 경우의 수} 이므로

답은 (F(l, n)- F(l-1,n)+ MAX )%MAX 이다. //MAX를 더해주는 경우는 음수가 나올 경우 예외 처리.


학회원 분 도움 아니였으면 혼자서는 절대 못풀었을거같은 난이도네요 ㅠㅠ

참고한 풀이 코드 https://pasdfq.blog.me/221490291319


'알고리즘 > BAEKJOON' 카테고리의 다른 글

백준 1149번 RGB거리  (0) 2019.03.23
백준 16463번 13일의 금요일  (0) 2019.03.22
백준 2503번 숫자 야구  (0) 2019.02.10
백준 2167번 2차원 배열의 합  (0) 2019.02.07
백준 1806번 부분합  (0) 2019.02.07

+ Recent posts