Two possible pedigrees have 5 nodes and height equal to 3:
@ @ / \ / @ @ and @ @ / \ / @ @ @ @ 题意:给你 n 个元素,可以组成多少颗深度为 m 的二叉树,每个结点的度只有 0 或 2 。
果然不好下手就是DP题。本题DP状态定义就显得十分重要了。如果直接定义dp[i][j] 表示 用i个元素 深度为j的二叉树。发现并不好转移。于是 别人就想到了 定义dp[i][j]表示 用i个元素按 深度小于等于j的二叉树。?于是怎么转移呢? 我们的二叉树可以 分解为 root,lson and rson 。root 占了一个深度。于是 lson and rson 分别代表的深度只需要小于等于 j-1 再加上root(深度为1) ,总的深度就小于等于j了。 再于是,DP[i][j] = ∑DP[k][j-1] + DP[i-1-k][j-1](k=1,2.....i-2)(root用掉一个元素 lson k个 rson i-1-k个) 最后的答案!就是DP[n][k]-DP[n][k-1] 巧妙~代码:
/* ID:Andy Chen PROG:nocows LANG:C++ */ #include<cstdio> #include<iostream> #include<cstring> using namespace std; int dp[300][300]; int n,k; #define mod 9901 int main() { freopen("nocows.in","r",stdin); freopen("nocows.ouw","w",stdout); while(scanf("%d%d",&n,&k)!=EOF) { memset(dp,0,sizeof(dp)); for(int i=1;i<=k;++i) dp[1][i]=1; for(int i=2;i<=n;++i) for(int j=1;j<=k;++j) for(int p=1;p<=i-2;++p) dp[i][j]=(dp[i][j]+dp[p][j-1]*dp[i-1-p][j-1])%mod; int ans=(dp[n][k]-dp[n][k-1])%mod; if(ans<0) ans+=mod; cout<<ans<<endl; } return 0; }
时间: 2024-11-03 00:40:22