zoukankan      html  css  js  c++  java
  • usaco-Cow Pedigrees

    题意:

    求出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
  • 相关阅读:
    js基础之变量作用域和es6解构赋值
    js基础之函数的定义和调用
    js基础之引用数据类型
    js基础之基本数据类型
    js基础之变量声明提升
    浏览器渲染页面
    flex布局
    web前端性能优化
    动态修改docker容器环境变量env
    蓝鲸前端框架
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9322799.html
Copyright © 2011-2022 走看看