zoukankan      html  css  js  c++  java
  • 【USACO 2.3】Cow Pedigrees(DP)

    问n个结点深度为k且只有度为2或0的二叉树有多少种。

    dp[i][j]=dp[lk][ln]*dp[rk][j-1-ln],max(lk,rk)=i-1。

    http://train.usaco.org/usacoprob2?a=chObWjKZP9z&S=nocows

    /*
    TASK:nocows
    LANG:C++
    */
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define M 9901
    #define N 205
    int n,k,ans;
    int dp[N][N];
    int num(int n,int k){//n个结点,深度k的树有几颗
        if(dp[n][k]!=-1)return dp[n][k];
        if(n==1)
            return k==1?dp[n][k]=1:dp[n][k]=0;
        dp[n][k]=0;
        for(int rk=1;rk<=k-1;rk++)//右子树深度rk
            for(int ln=(k-1)*2-1;ln<=n-rk*2;ln+=2)
            //左子树结点,k-1深度至少(k-1)*2-1个结点,至多n-1-右子树结点的最少数量
                dp[n][k]=(dp[n][k]+num(ln,k-1)*num(n-1-ln,rk)*(rk==k-1?1:2))%M;
                //因为左右交换就是不同的树,都是k-1深度的只算一次。
        return dp[n][k];
    }
    int main(){
        memset(dp,-1,sizeof dp);
        freopen("nocows.in","r",stdin);
        freopen("nocows.out","w",stdout);
        scanf("%d%d",&n,&k);
        printf("%d
    ",num(n,k));
    }    

      

  • 相关阅读:
    科普园地
    专家段 错误 新闻
    16进制转rgb
    图片截取0825
    域名的问题 图片显示不出来
    height cell0809
    添加银行卡
    DeviceDelegateHelper.m
    UUID
    MBProgressHUD 动画
  • 原文地址:https://www.cnblogs.com/flipped/p/6003602.html
Copyright © 2011-2022 走看看