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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pg高性能服务器,Pgpool-II 负载均衡对PG的性能影响

Pgpool-II相当于中间件&#xff0c;Pgpool-II与PG是解耦合的&#xff0c;基于这样的机制&#xff0c;Pgpool-II可以搭建在已经存在的任意版本的PG主从结构上&#xff0c;主从结构的实现与Pgpool-II无关&#xff0c;可以通过slony等工具或者PG自身的流复制机制实现。一、拓扑结构…

股上涨和下跌天数比_面对下跌,如何信心十足地逢低买入?

大众总是错的&#xff0c;对吗?也许大部分时间都是这样。但在股市“逢低买进”的想法&#xff0c;可能是金融市场中群策群力的一个罕见例子。这是一个有大量学术支持的老想法。但这并不是说股票市场总是在上涨&#xff0c;事实上&#xff0c;当下跌来临的时候&#xff0c;它们…

前端学习(511):两列布局的第一种方式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>两列布局</title><style>.left{width: …

5g存储服务器是什么项目,5G时代对服务器有什么要求?

5G是什么?5G,其中字母G代表generation(代、际)。即第五代移动电话行动通信标准&#xff0c;也称第五代移动通信技术。5G的应用范围很广&#xff0c;大致可以包括以下几个方面&#xff1a;1、5G综合产业链分析2、5G与物联网3、5G与车联网4、5G与无线医疗5G对服务器的要求“云端…

压缩命令_Linux gzip命令:压缩文件或目录

gzip 是 Linux 系统中经常用来对文件进行压缩和解压缩的命令,通过此命令压缩得到的新文件,其扩展名通常标记为“.gz”。 再强调一下,gzip 命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件。 gzip 命令的基本格式如下: [root@localhost ~]…

对链表的插入操作

对链表的插入操作转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/24/3846538.html

前端学习(512):两列布局的第一种方式的优缺点

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>两列布局</title><style>.left{width: …

svn服务器如何扫描文件,基于文件仓库进行建模协作(EA+SVN)

在文章《协同建模&版本管理(基于EA)》一文中&#xff0c;我们提到EA有四种协同建模方式&#xff1a;基于本地文件基本共享文件仓库基于模型数据库基于云服务今天我们主要介绍一下第二种方式 基于共享文件仓库进行建模协作。这种方式主要是对EA中各个模型包应用版本控制来实…

获取本地 qt_用QT实现视频/音乐播放组件

前言我已经有四五天没有发布文章了&#xff0c;趁着这个周末有空&#xff0c;就又开始构思我们自己的QT组件库中的新组件&#xff0c;思考还有哪些有用、有趣、值得研究学习并构建实现的组件&#xff0c;于是又有了两个新的目标&#xff0c;即多媒体播放组件和地图组件。之所以…

c++文件读写

http://stlchina.huhoo.net/bin/view.pl/Main/STLDetailString 添加#include <fstream> using namespace std; View Code 1 //ofstream myfile("c:\\1.txt",ios::out|ios::trunc);2 //3 //myfile<<"中国国国" << endl<< "网…

天龙八部网单服务器技能修改,天龙八部3门派技能修改介绍

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼少林伏虎拳 对该技能的攻击动作进行了修改弥勒护身 释放不再消耗真气明镜台 现在此技能可以对队友释放金刚不坏体 减伤效果提高到了70%天龙正气浩然 释放不再消耗真气静影沉璧 减少了此技能的打蓝效果截拳式 现在这个状态可以增加内…

【Codeforces #130 Div2】Solutions

【208A Dubstep】 http://codeforces.ru/problemset/problem/208/A 题目大意&#xff1a;一个句子被添加了若干“WUB”&#xff0c;问原句。 将WUB去掉就行了&#xff0c;在句首或句尾直接删除&#xff0c;在句中替换成空格&#xff0c;注意多个“WUB”相连时特判。 #include …

服务器此时无法接受控制信息,您无法修改域或信任信息,因为无法联系一个主域控制器(PDC)仿真器,请确认当前域的PDC仿真器和网络都联机并正常运行。...

问题补充&#xff1a;PS C:\Users\administrator.TF> netdom query fsmo架构主机 AD-server.tf.com域命名主机 AD-server.tf.comPDC AD-server.tf.comRID 池管理器 AD-server.tf.com结构主机 AD-server.tf.c…

VC++6.0如何创建与调用动态链接库(dll)

VC支持的DLL&#xff1a; DLL的编制与具体的编程语言及编译器无关&#xff0c;动态链接库随处可见&#xff0c;VC支持三种DLL&#xff1a;非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数&#xff08;或变量、类&#xff09;可供应用程序调用&#xff1b;DLL内部函数只能在D…

谁在窥屏_TheShy直播被窥屏搞怕了,为了防止被窥屏,这个做法绝了

前言&#xff1a;英雄联盟LPL赛区已经发展了十年&#xff0c;请你大胆试想下&#xff0c;如果终有一天英雄联盟会被其他游戏所淹没替代&#xff0c;让你选出自己心目中最强的游戏玩家&#xff0c;你的脑海里首先浮现的是谁的身影呢&#xff1f;笔者的脑海里首先是TheShy。TheSh…

前端学习(516):两列布局的第三种解决方案

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>第三种实现方案</title><style>.parent…

如何在Linux下安装nginx

如何在Linux下安装nginx 1.http://nginx.org 下载对应平台的安装初始配置文件 2.yum install nginxposted on 2012-07-25 15:41 ericyuan 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ericyuan/archive/2012/07/25/2608425.html

qchart 设置线颜色_实战PyQt5: 137-QChart图表之散点图

散点图(scatter chart)将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。在QChart中&#xff0c;使用类QScatterSeries创建散点图。QScatterSeriesQScatterSeries类在散点图中显示数据。散点数据在图表上显示为…