题目链接


Solution

我DP太菜啦...

考虑到一棵二叉树是由根节点以及左儿子和右儿子构成。

所以答案其实就是 左儿子方案数*右儿子方案数 。

状态定义:

\(f[i][j]\) 代表深度为 \(i\) ,节点个数为 \(j\) 的二叉树方案数。

转移方程:

对于每一个状态,节点总数已经确定。

那么枚举一维左子树的节点个数,右边用总数减去。

如果要构建一棵深度为 \(i\) 的二叉树,则两棵子树中必有一棵深度为 \(i-1\) 。

此时有三种情况:

  1. 左子树深度小于 \(i-1\),右子树深度为 \(i-1\)。
  2. 右子树深度小于 \(i-1\),左子树深度为 \(i-1\)。
  3. 两边子树深度均为 \(i-1\)。

由于我们需要的是深度小于 \(i-1\) 的所有情况,所以记录一个前缀和 \(sum\) 。

每一次要加上的便是 \(sum_{i-2}\) 。

然后参照以上做即可。

Code

#include<bits/stdc++.h>
using namespace std;
const int mod=9901;
int f[110][210],n,k,sum[110][210]; int main()
{
scanf("%d%d", &n, &k);
f[1][1]=1;
for (int i=2;i<=k;i++)
for (int j=1;j<=n;j++)
{
for (int p=1;p<j;p++)
{
f[i][j]=(f[i][j]+sum[i-2][p]*f[i-1][j-p-1])%mod;
f[i][j]=(f[i][j]+sum[i-2][j-p-1]*f[i-1][p])%mod;
f[i][j]=(f[i][j]+f[i-1][p]*f[i-1][j-p-1])%mod;
}
sum[i-1][j]=(sum[i-2][j]+f[i-1][j])%mod;
}
printf("%d\n", f[k][n]); return 0;
}

[USACO Section 2.3] Cow Pedigrees (动态规划)的更多相关文章

  1. 【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 ...

  2. USACO 2.3 Cow Pedigrees

    Cow Pedigrees Silviu Ganceanu -- 2003 Farmer John is considering purchasing a new herd of cows. In t ...

  3. 洛谷P1472 奶牛家谱 Cow Pedigrees

    P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备 ...

  4. USACO 奶牛抗议 Generic Cow Protests

    USACO 奶牛抗议 Generic Cow Protests Description 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约翰希望 ...

  5. USACO Section 2.3 奶牛家谱 Cow Pedigrees

    OJ:http://www.luogu.org/problem/show?pid=1472 #include<iostream> using namespace std; const in ...

  6. USACO Cow Pedigrees 【Dp】

    一道经典Dp. 定义dp[i][j] 表示由i个节点,j 层高度的累计方法数 状态转移方程为: 用i个点组成深度最多为j的二叉树的方法树等于组成左子树的方法数 乘于组成右子树的方法数再累计. & ...

  7. USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】

    nocows解题报告------------------------------------------------------------------------------------------ ...

  8. [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)

    题目链接 Solution 完全背包 \(dp\) , 同时再加一个数组 \(v[i][j]\) 记录当总和为\(j\) 时第 \(i\) 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序 ...

  9. [USACO Section 3.2] 01串 Stringsobits (动态规划)

    题目链接 Solution 贼有意思的 DP, 也可以用组合数学做. \(f[i][j]\) 代表前 \(i\) 位,有 \(j\) 个 \(1\) 的方案数. 转移方程很简单 : \(f[i][j] ...

随机推荐

  1. 多线程程序设计-Thread的一些方法

    run():是程序中会和会和其他线程“同时”执行的部分.   wait():使得当前线程进入等待状态,等待的线程不会主动进入到线程队列中排队等待cpu资源,必须由其他线程调用notify()方法通知它 ...

  2. CPP-基础:有关调用约定

    在C语言中,假设咱们有这样的一个函数:int function(int a,int b) 调历时只有用result = function(1,2)的方法就能利用这个函数.然而,当高档语言被编译成计算机 ...

  3. RuntimeError: cryptography is required for sha256_password or caching_sha2_p

    报错原因:mysql版本身份验证出现问题引起的 我这里报错的地方是在Django里,pycharm连接数据库时出现的 解决办法,安装安装cryptography即可:pip install crypt ...

  4. Java删除开头和末尾字符串

    //扩展2个String方法 /* * 删除开头字符串 */ public static String trimstart(String inStr, String prefix) { if (inS ...

  5. javaweb基础(9)_Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  6. flowvisor连接ovs

    1 开启flowvisor $ sudo -u flowvisor fvconfig generate /etc/flowvisor/config.json $ sudo /etc/init.d/fl ...

  7. lua 分割字符串

    -- 参数:待分割的字符串,分割字符 -- 返回:子串表.(含有空串) function split(str, split_char) local sub_str_tab = {} while tru ...

  8. Linux - mkdir -p a/b/c

    mkdir -p a/b/c -p  会循环创建

  9. 【nginx】nginx.sh nginx 安装脚本

    #! /bin/shcd /usr/local/srcwget http://nginx.org/download/nginx-1.10.1.tar.gzecho 'download success' ...

  10. python基本数据类型和简单用法

    一.int 整形范围 How Big Is an int? In Python2, the size of an int was limited to 32 bits, which is enough ...