码迷,mamicode.com
首页 > 其他好文 > 详细

usaco-Cow Pedigrees

时间:2018-07-17 14:20:36      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:one   splay   树节点   opened   pre   tor   string   alt   fine   

题意:

求出n个节点可以构成多少种高为h的二叉树。
分析:

设左子树节点数x,右子树节点数为n-x-1,函数dp表示满足条件的树的个数,则dp(n)=dp(x)*(n-x-1)。

对于未知数h,dp[n]=∑dp[x]*dp[n-x-1],(x<=n-2,x in [1,3,5,…])。

故设dp[i][j]表示高不大于i,节点数为j的子树个数。易得状态转移方程为:dp[i][j]=∑dp[i-1][k]*dp[i-1][j-k-1],(k in [1,3,5,…,j-2]),其中,边界条件:dp[i][1]=1,显然结果为dp[h][n]-dp[h-1][n]。

技术分享图片
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
int n,h,dp[205][205];
void init(){
    cin>>n>>h;
    fill(dp,0);
    range(i,1,h)dp[i][1]=1;
}
void solve(){
    range(i,1,h)
        range(j,3,n) {
            range(k, 1, j - 2) {
                dp[i][j]=(dp[i][j]+dp[i-1][k]*dp[i-1][j-k-1]%9901)%9901;
                ++k;
            }
            ++j;
        }
    cout<<(dp[h][n]-dp[h-1][n]+9901)%9901<<endl;
}
int main() {
    init();
    solve();
    return 0;
}
View Code

 

usaco-Cow Pedigrees

标签:one   splay   树节点   opened   pre   tor   string   alt   fine   

原文地址:https://www.cnblogs.com/Rhythm-/p/9322799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!