1. 程式人生 > ><html>

<html>

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條評論
技術分享
發表評論 HTML/XML objective-c Delphi Ruby PHP C# C++ JavaScript Visual Basic Python Java CSS SQL 其他

相關文章推薦

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&lt;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師順利通關--徐朋
  • 微博 微信 QQ
收藏助手 不良信息舉報
您舉報文章:深度學習:神經網絡中的前向傳播和反向傳播算法推導
舉報原因:
原因補充:

(最多僅僅同意輸入30個字)

技術分享

<html>