【dp】奶牛家谱 Cow Pedigrees
令人窒息的奶牛题
题目描述
农民约翰准备购买一群新奶牛。 在这个新的奶牛群中, 每一个母亲奶牛都生两个小奶牛。这些奶牛间的关系可以用二叉树来表示。这些二叉树总共有N个节点(3 <= N < 200)。这些二叉树有如下性质:
每一个节点的度是0或2。度是这个节点的孩子的数目。
树的高度等于K(1 < K < 100)。高度是从根到最远的那个叶子所需要经过的结点数; 叶子是指没有孩子的节点。
有多少不同的家谱结构? 如果一个家谱的树结构不同于另一个的, 那么这两个家谱就是不同的。输出可能的家谱树的个数除以9901的余数。
输入输出格式
输入格式:
两个空格分开的整数, N和K。
输出格式:
一个整数,表示可能的家谱树的个数除以9901的余数。
题目分析
无脑dfs
我们可以显而易见地想到dfs做法。给每一个点赋编号,再接着枚举有无孩子的状态。然后如果再大力剪枝,就可以惊喜地发现到$n=60$之后就TLE到飞起了。
像dp的假dp
这不是一道dp题嘛……考虑一下转移,发现每一种树要么从同一层转移过来、要么从上一层转移过来。那么接着存一存每一种树最下面一层的叶子节点数,再存一存每一种树方案总数,接着就是这些信息的转移……搞来搞去我也搞不清这是什么东西了。
树形dpⅠ
设$f[i][j]$表示$i$个节点构造出深度为$j$的树的方案数。显而易见的是,转移方程为
其中,即f[i][k]的前缀和。
在转移的时候,我们只需要枚举右孩子的节点数,再利用乘法原理乘上左孩子深度为$j-1$(除去根)的方案数。之后再将重复的情况减一下就可以了。
这看上去并没有什么问题对吧。
看到这里大佬您有没有发现这个dp出锅了呢。
是!的!这个人畜无害的dp出锅了!!!
并且截止撰写这篇博客的时候,依然没有找出问题在哪里……
如果大佬您发现了问题,麻烦在评论区留言,谢谢!
树形dp Ⅱ
XYZ表示dp方程并不用这么复杂并且表示我的代码画风清奇非常鬼畜
好吧,似乎这份是有点又臭又长的感觉
我们以$f[i][j]$表示$i$个节点,$1..j$深度的方案数的前缀和。那么转移起来就方便很多;并且得益于dp方程的定义,子树节点个数是可以枚举过去的,不存在上面做法方案数乘2的事情,因此也不用管重复的问题了。
#include<bits/stdc++.h>
const int MO = ;
int f[][];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=m; i++)
f[][i] = ;
for (int i=; i<=n; i+=)
for (int j=; j<=m; j++)
for (int k=; k<i; k+=)
(f[i][j]+=f[k][j-]*f[i-k-][j-])%=MO;
printf("%d\n",(f[n][m]+MO-f[n][m-])%MO);
return ;
}
这道题真的是挺(wo)有(tai)趣(cai)的(le),这些一步一步的写法倒也是有很多值得深思的地方。
(似乎为了这题写的程序数量可以立个记录之类的?)
END
【dp】奶牛家谱 Cow Pedigrees的更多相关文章
- 洛谷P1472 奶牛家谱 Cow Pedigrees
P1472 奶牛家谱 Cow Pedigrees 102通过 193提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 农民约翰准备 ...
- [luoguP1472] 奶牛家谱 Cow Pedigrees(DP)
传送门 一个深度为i的树可以由一个根节点外加两个深度为i-1的树组成,这就决定了DP该怎么写. 然而我真的没有想到. f[i][j]表示深度为i节点数为j的个数 sum[i][j]表示深度小于等于i节 ...
- USACO Section 2.3 奶牛家谱 Cow Pedigrees
OJ:http://www.luogu.org/problem/show?pid=1472 #include<iostream> using namespace std; const in ...
- 洛谷 1472 奶牛家谱 Cow Pedigrees
[题解] DP题,我们用f[i][j]表示有n个节点.高度小于等于j的二叉树的个数.f[i][j]=sigma(f[t][j-1]*f[i-t-1][j-1]) t是1~i-1范围内的奇数. #inc ...
- P1472 奶牛家谱 Cow Pedigrees
题意:问你指定二叉树有几种 1.高度为k 2.节点数为n 3.每个点的度为0或2 爆搜------->30分QAQ 首先,因为每个节点度为0或2, 所以如果n是偶数直接输出0就行了吧(嘿嘿) 如 ...
- 洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
题面 这道题我觉得是个不错的题: 根据题意可以较清晰的发现ans只和n和k有关:(因为输入的只有这两个数啊~): 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并 ...
- USACO 2.3 Cow Pedigrees
Cow Pedigrees Silviu Ganceanu -- 2003 Farmer John is considering purchasing a new herd of cows. In t ...
- 【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 ...
- USACO Cow Pedigrees 【Dp】
一道经典Dp. 定义dp[i][j] 表示由i个节点,j 层高度的累计方法数 状态转移方程为: 用i个点组成深度最多为j的二叉树的方法树等于组成左子树的方法数 乘于组成右子树的方法数再累计. & ...
随机推荐
- Win10文件无法重命名
适用版本:Win10 Lenovo ideapad 310s 方法一:禁用所有开机启动项,重启 方法二:进入安全模式测试 方法三:新建一个账户
- (转)Bash Shell常用快捷键
Bash Shell常用快捷键 原文:https://github.com/hokein/Wiki/wiki/Bash-Shell%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B ...
- Comparing Two High-Performance I/O Design Patterns--reference
by Alexander Libman with Vladimir GilbourdNovember 25, 2005 Summary This article investigates and co ...
- 性能测试学习第十天_controller
集合点设置 controller虚拟多个用户执行脚本启动步骤不一定同步,集合点在脚本的某处设置一个标记,当有虚拟用户运行到这个标记的时候,停下等待所有用户都达到这个标记,再一同进行下面的步骤.这样可以 ...
- java - Socket简单编程实践
1.简介: 1)SOCKET是应用程序和网络之间的一个接口.SOCKET创建设置好以后,应用程序可以: 通过网络把数据发送到socket . 通过网络从socket接收数据.(通信的前提是应用程序知道 ...
- java 基础 03 运算符 分支结构 循环结构
今天内容: (1)运算符 (2)分支结构 (3)循环结构 1运算符 1.1赋值运算符 (1)简单赋值 = 表示赋值运算符,用于将=右边的数据赋值给=左边的变量来覆盖原来的数值. 笔试题: ia == ...
- 比例缩放 on() prop() 正则表达式
$('#banner-section').css('height',$(window).width() / 1900 * 490 ); $(window).resize(function(){ ...
- mysql对库,表,数据类型的操作以及完整性约束
一丶对库的操作 求救语法: help create database; 1.创建数据库 CREATE DATABASE 数据库名 charset utf8; 2.数据库的命名规则: 可以由字母.数字. ...
- 【Python】python2 html safe string
import cgi s = '<>&' s += u'哈哈' print type(s) print s r = cgi.escape(s) print type(r) prin ...
- Javascript Functions
Javascript 全局对象 全局属性和函数可用于所有内建的Javascript对象 顶层函数(全局函数) decodeURI()解码某个编码的URI. decodeURIComponent()解码 ...