农民约翰准备购买一群新奶牛。 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛。这些奶牛间的关系可以用二叉树来表示。这些二叉树总共有N个节点(3 <= N < 200)。这些二叉树有如下性质:

描述

每一个节点的度是0或2。度是这个节点的孩子的数目。

树的高度等于K(1 < K < 100)。高度是从根到最远的那个叶子所需要经过的结点数; 叶子是指没有孩子的节点。

有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的。输出可能的家谱树的个数除以9901的余数。

格式

PROGRAM NAME: nocows

INPUT FORMAT (file nocows.in)

第1行: 两个空格分开的整数, N和K。

OUTPUT FORMAT (file nocows.out)

第 1 行: 一个整数,表示可能的家谱树的个数除以9901的余数。

SAMPLE INPUT

5 3

SAMPLE OUTPUT

2

OUTPUT DETAILS

有5个节点,高为3的两个不同的家谱:

           @                              @/ \                            / \@   @        和                @   @/ \                                / \@   @                              @   @
分析:
这道题因为对树不太熟悉,自己没有想出来,,,看的官方的解题报告:

这是一个DP问题。我们所关心的树的性质是深度和节点数,所以我们可以做这样一张表:table[i][j]表示深度为i、节点数为j的树的个数。根据给定的约束条件,j必须为奇数。你如何构造一棵树呢?当然是由更小的树来构造了。一棵深度为i、节点数为j的树可以由两个子树以及一个根结点构造而成。当i、j已经选定时,我们选择左子树的节点数k。这样我们也就知道了右子树的节点数,即j-k-1。至于深度,至少要有一棵子树的深度为i-1才能使构造出的新树深度为i。有三种可能的情况:左子树深度为i-1 ,右子树深度小于i-1;右子树深度为i-1,左子树深度小于i-1;左右子树深度都为i-1。事实上,当我们在构造一棵深度为i的树时,我们只关心使用的子树深度是否为i-1或更小。因此,我们使用另一个数组smalltrees[i-2][j]记录所有深度小于i-1的树,而不仅仅是深度为i-2的树。知道了上面的这些,我们就可以用以下三种可能的方法来建树了:

table[i][j] := smalltrees[i-2][k]*table[i-1][j-1-k];// 左子树深度小于i-1,右子树深度为i-1
table[i][j] := table[i-1][k]*smalltrees[i-2][j-1-k];// 左子树深度为i-1,右子树深度小于i-1
table[i][j] := table[i-1][k]*table[i-1][j-1-k];// 左右子树深度都为i-1 
另外,如果左子树更小,我们可以对它进行两次计数,因为可以通过交换左右子树来得到不同的树。总运行时间为O(K*N^2),且有不错的常数因子。
代码:

#include <cstdio>
#include <cstdlib>
#include <cassert>
#define MOD 9901
using namespace std;int table[101][202],N,K,c;
int smalltrees[101][202];FILE *fin=fopen("nocows.in","r");
FILE *fout=fopen("nocows.out","w");int main() {fscanf (fin,"%d %d",&N,&K);table[1][1]=1;for (int i=2;i<=K;i++) {for (int j=1;j<=N;j+=2)for (int k=1;k<=j-1-k;k+=2) {if (k!=j-1-k) c=2; else c=1;  //判断树的结构是否对称  table[i][j]+=c*(smalltrees[i-2][k]*table[i-1][j-1-k]  // 左子树深度小于i-1+table[i-1][k]*smalltrees[i-2][j-1-k]  // 右子树深度小于i-1+table[i-1][k]*table[i-1][j-1-k]);// 都为i-1table[i][j]%=MOD;}for (int k=0;k<=N;k++) { // 确保接下来第i次迭代中的smalltrees[i-2][j]包含了深度小于i-1且节点数为j的树的个数smalltrees[i-1][k]+=table[i-1][k]+smalltrees[i-2][k]; smalltrees[i-1][k]%=MOD; }}fprintf (fout,"%d\n",table[K][N]);return 0;
}

 

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2012/07/19/2598501.html

USACO / Cow Pedigrees(DP)相关推荐

  1. poj 1964 Cow Cycling(dp)

    /* 一开始想的二维的 只维护第几只牛还有圈数 后来发现每只牛的能量是跟随每个状态的 所以再加一维 f[i][j][k]表示第i只牛 领跑的j全 已经消耗了k体力 转移的话分两类 1.换一只牛领跑 那 ...

  2. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  3. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  4. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  5. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  6. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  7. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

  8. LeetCode 1155. 掷骰子的N种方法(DP)

    1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...

  9. LeetCode 1139. 最大的以 1 为边界的正方形(DP)

    1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...

最新文章

  1. linux关机重启注销命令,Linux的注销、关机、重启基本命令介绍
  2. Windows Phone 7 不温不火学习之《创建用户控件》
  3. (JAVA学习笔记) 关于数据类型的一些扩展-面试时经常问到的问题
  4. 小米4系统定位服务器地址,小米4原装浏览器怎么开启定位系统
  5. NHMicro业务脚本热部署快速开发框架介绍
  6. 微型计算机接口部件的结构,微机接口课后习题解析.doc
  7. hbase分布式集群搭建
  8. sv_labs学习笔记 专栏说明博文目录
  9. 计算机ck,[计算机]ck编程速成.doc
  10. 【SPOJ - NSUBSTR】Substring(统计长度为x的子串最多出现的次数--后缀自动机)
  11. C#抓取网页数据、分析并且去除HTML标签(转载)
  12. buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
  13. 各种快捷键组合操作让Spotlight搜索变得无比强大
  14. Citrix提供免费阳春版XenServer
  15. 阿里云ECS云服务器实例重置-更换操作系统
  16. STM32标准库与HAL库全系列下载地址
  17. Python中的图像处理(第六章)Python图像量化及采样处理(2)
  18. 服务器运维KPI指标,IT运维包括哪些内容,考核标准是什么
  19. 2021年RHCE考试题解法
  20. 基于html+css的图片旋转

热门文章

  1. Taro+react开发(2)--简介2
  2. [css] 写出你知道的CSS水平和垂直居中的方法
  3. [css] 说说你对GPU的理解,举例说明哪些元素能触发GPU硬件加速?
  4. 工作314:uni-提交成功加入表单验证
  5. [js] 说说你对JS中暂性死区的理解,它有什么运用场景?
  6. 前端学习(2186):知识回顾
  7. 前端学习(2133):前端代码复杂带来的问题
  8. “睡服”面试官系列第六篇之set数据结构(建议收藏学习)
  9. 前端学习(1400):多人管理20代码优化
  10. 前端学习(41):背景实现视觉差效果