<html>
阿新 • • 發佈:2017-08-11
val apple trap while from div sop tails err
閱讀全文 版權聲明:本文為博主原創文章,未經博主同意不得轉載。 舉報
pid=5370">題目鏈接:hdu 5370 Tree Maker
n個節點的二叉樹種類為Catalan數的第n項
對於一棵子樹而言,被移動過的節點就是確定的位置。所以僅僅要知道已經確定位置的K個節點有多少個空孩子指針M,和就該子樹下的N個未確定位置的節點,等於是說用N個節點構造M個可為空的子樹的種類數。對於整個樹的形態數即為若幹棵獨立的子樹形態數的乘積。
定義dp[i][j]為用i個節點構造j棵樹的形態數。dp[i][j] = sum{ dp[i-1][j-k] * catalan[k] | 0 ≤ k ≤j }, 用o(n^3)的復雜度預處理出dp數組。然後模擬操作後計算出每一個子樹的M和N。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 505; const int mod = 1e9 + 7; int dp[maxn][maxn], catalan[maxn]; void preserve () { catalan[0] = catalan[1] = 1; for (int i = 2; i <= 500; i++) { for (int j = 0; j < i; j++) catalan[i] = (catalan[i] + (ll) catalan[j] * catalan[i-j-1]) % mod; } dp[0][0] = 1; for (int i = 1; i <= 500; i++) { for (int j = 0; j <= 500; j++) { for (int k = 0; k <= j; k++) dp[i][j] = (dp[i][j] + (ll) dp[i-1][j-k] * catalan[k]) % mod; } } } int N, M, far[maxn], son[maxn][2], idx[maxn], cnt[maxn], sum[maxn]; inline int newNode (int f) { M++; cnt[M] = son[M][0] = son[M][1] = 0; far[M] = f; return M; } void init () { M = 0; int u = newNode(1), t, k; idx[u] = M; for (int i = 1; i <= N; i++) { scanf("%d", &t); if (t == 0) u = far[u]; else if (t <= 2) { if (son[u][t-1] == 0) { son[u][t-1] = newNode(u); idx[son[u][t-1]] = idx[u]; cnt[idx[u]]--; } u = son[u][t-1]; } else { scanf("%d", &k); son[u][t-3] = newNode(u); cnt[son[u][t-3]] = k - 1; idx[son[u][t-3]] = son[u][t-3]; } } memset(sum, 0, sizeof(sum)); for (int i = 1; i <= M; i++) { if (son[i][0] == 0) sum[idx[i]]++; if (son[i][1] == 0) sum[idx[i]]++; } } int solve () { int ret = 1; for (int i = 1; i <= M; i++) { if (idx[i] != i) continue; ret = (ll) ret * dp[sum[i]][cnt[i]] % mod; } return ret; } int main () { preserve(); int cas = 1; while (scanf("%d", &N) == 1) { init (); printf("Case #%d: %d\n", cas++, solve ()); } return 0; }
閱讀全文 版權聲明:本文為博主原創文章,未經博主同意不得轉載。 舉報
- 本文已收錄於下面專欄:
0條評論
相關文章推薦
-
hdu-1267 下沙的沙子有幾粒 DP/Catalan
題目鏈接:hdu 5370 Tree Maker n個節點的二叉樹種類為Catalan數的第n項 對於一棵子樹而言。被移動過的節點就是確定的位置。所以僅僅要知道已經確定位置的K個節點有多少個...- hss871838309
- 2012-03-01 15:06
- 501
-
hdu 4359 Easy Tree DP?
Best solutions forProblem 4359 <div align="right" style="font-family: Arial; font-size: 12px; f- java-mans
- 2012-08-10 14:09
- 370
-
HDU-4714 Tree2cycle(樹型dp)
題目鏈接:hdu 5370 Tree Maker n個節點的二叉樹種類為Catalan數的第n項 對於一棵子樹而言。被移動過的節點就是確定的位置,所以僅僅要知道已經確定位置的K個節點有多少個...- qq_31759205
- 昨天 00:20
- 11
-
hdu 1023 Train Problem II catalan數列 大數乘除
Train Problem II Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2714Accepted Submission(s): 1517</str- hulunberbus
- 2012-02-28 17:44
- 385
-
HDU5370 Tree Maker
題目鏈接:hdu 5370 Tree Maker n個節點的二叉樹種類為Catalan數的第n項 對於一棵子樹而言,被移動過的節點就是確定的位置,所以僅僅要知道已經確定位置的K個節點有多少個...- kyleyoung_ymj
- 2016-06-28 15:52
- 184
-
poj 2378 Tree Cutting(樹形dp)
本文出自 <a target="_blank" href="http://blog.csdn.net/shuangde800" style="color: rgb(202,0,0);- king_tt
- 2013-08-31 14:31
- 386
-
2017多校第3場 HDU 6065 RXD, tree and sequence LCA,DP
題目鏈接:hdu 5370 Tree Maker n個節點的二叉樹種類為Catalan數的第n項 對於一棵子樹而言,被移動過的節點就是確定的位置,所以僅僅要知道已經確定位置的K個節點有多少個...- just_sort
- 5天前 09:08
- 35
-
ural 1018 Binary Apple Tree(樹形dp | 經典)
本文- king_tt
- 2013-09-02 00:49
- 325
-
hdu-1267 下沙的沙子有幾粒 DP/Catalan
糾結 的題啊 ACMStep的2.3.8 在2.3裏一看題就往Catalan數上想了 非常欣喜的推導出了公式:C[m][n]=(m-n+1)/n*C[m][n-1];C[m][0]=1;當中。m是D能夠放置的位置數。最後用大數的處理方式計算出了結果 提交後WA嗄 楞是想了半天不知道為何嗄 最後的最後 找了himdd的博文,發現能夠用DP的思想。 解法一:DP 代碼及解析例如以下: #include<iost
- java-mans
- 2012-03-01 15:06
- 423
-
HDU 6035 Colorful Tree(樹形dp)
題目鏈接:hdu 5370 Tree Maker n個節點的二叉樹種類為Catalan數的第n項 對於一棵子樹而言,被移動過的節點就是確定的位置,所以僅僅要知道已經確定位置的K個節點有多少個...- addkai
- 2017-07-29 18:11
- 20
- 原創
- 304
- 粉絲
- 12
- 喜歡
- 0
- hdu 5876 Sparse Graph(BFS+並查集)
- hdu 5875 Function(高效)
- hdu 5593 ZYB's Tree(樹形dp)
- hdu 5592 ZYB's Premutation(線段樹)
在線課程
- 【直播】機器學習&數據挖掘7周實訓--韋瑋
- 【套餐】系統集成項目管理project師順利通關--徐朋