백준 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 == 0) return 1; if (l == 0) return 0; long long &ret = dp[l][n]; if (ret != -1) return 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, -1, sizeof(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 |