USACO / Cow Pedigrees(DP)
农民约翰准备购买一群新奶牛。 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛。这些奶牛间的关系可以用二叉树来表示。这些二叉树总共有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)相关推荐
- poj 1964 Cow Cycling(dp)
/* 一开始想的二维的 只维护第几只牛还有圈数 后来发现每只牛的能量是跟随每个状态的 所以再加一维 f[i][j][k]表示第i只牛 领跑的j全 已经消耗了k体力 转移的话分两类 1.换一只牛领跑 那 ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
- LeetCode 1220. 统计元音字母序列的数目(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...
- LeetCode 265. 粉刷房子 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...
- LeetCode 256. 粉刷房子(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LeetCode 1139. 最大的以 1 为边界的正方形(DP)
1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...
最新文章
- linux关机重启注销命令,Linux的注销、关机、重启基本命令介绍
- Windows Phone 7 不温不火学习之《创建用户控件》
- (JAVA学习笔记) 关于数据类型的一些扩展-面试时经常问到的问题
- 小米4系统定位服务器地址,小米4原装浏览器怎么开启定位系统
- NHMicro业务脚本热部署快速开发框架介绍
- 微型计算机接口部件的结构,微机接口课后习题解析.doc
- hbase分布式集群搭建
- sv_labs学习笔记 专栏说明博文目录
- 计算机ck,[计算机]ck编程速成.doc
- 【SPOJ - NSUBSTR】Substring(统计长度为x的子串最多出现的次数--后缀自动机)
- C#抓取网页数据、分析并且去除HTML标签(转载)
- buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
- 各种快捷键组合操作让Spotlight搜索变得无比强大
- Citrix提供免费阳春版XenServer
- 阿里云ECS云服务器实例重置-更换操作系统
- STM32标准库与HAL库全系列下载地址
- Python中的图像处理(第六章)Python图像量化及采样处理(2)
- 服务器运维KPI指标,IT运维包括哪些内容,考核标准是什么
- 2021年RHCE考试题解法
- 基于html+css的图片旋转
热门文章
- Taro+react开发(2)--简介2
- [css] 写出你知道的CSS水平和垂直居中的方法
- [css] 说说你对GPU的理解,举例说明哪些元素能触发GPU硬件加速?
- 工作314:uni-提交成功加入表单验证
- [js] 说说你对JS中暂性死区的理解,它有什么运用场景?
- 前端学习(2186):知识回顾
- 前端学习(2133):前端代码复杂带来的问题
- “睡服”面试官系列第六篇之set数据结构(建议收藏学习)
- 前端学习(1400):多人管理20代码优化
- 前端学习(41):背景实现视觉差效果