题意:2-3树的每个结点(除了叶子外)有2或3个孩子(分支),假设是一个满2-3树,那么给出叶子的数量,求这样的树有多少棵。(注:有2个孩子的结点视为相同,有3个孩子的结点视为相同,比如倒数第2层有4个结点,且叶子有4+6=10个,即2个有2孩的结点在前面,2个有3孩的结点在后面,那么头两个结点的孩子互换是视为相同的,如下图)

只要结点1234各自的孩子数不变,则视为同棵树。若具有2孩的结点跟具有3孩的结点换位置,则为不同树,比如1和3换个位置。)

思路:

(1)考虑DP,依靠叶子数量小的,推出叶子数量大的。dp[k]表示叶子数为k的树有多少棵。那么只有一个结点的情况dp[1]=1我们是知道的。

(2)如何dp?

  dp[k]可以更新后面的点有dp[2k~3k],将k看成倒数第2层,那么其每个结点可以决定最底层的叶子个数。比如第1个结点生2孩,其他结点生3孩,可以更新dp[1*2+(k-1)*3]。

  这一步只需要枚举2的个数即可,2的个数可以从0→k。设k=a+b,a个生2孩,b个生3孩,那么q=a*2+b*3为我们可以更新的点,则dp[q]+=dp[k]*c[k][a],这里c[k][a]的意思是组合数学中Ck取a的组合数。任何一个dp[x]都可能被多个不同的2-3树发展多一层而变来的,例如dp[3]可以更新dp[9],dp[4]当3个结点生2孩,1个结点生3孩也可以更新到dp[9],。

(3)需要预先求得c[x][y]的所有可能,因为后面可能多次引用,逐个计算复杂度会过高。利用杨辉三角可以计算Cn取k这样的组合数。

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
LL dp[N*];
LL c[N/][N/]; unsigned int n,r;
void pre() //组合数,类似于一个黑色的袋子中摸出黑球和白球,黑白球代表2或3孩子,组成有序序列
{
memset(c,,sizeof(c));
c[][]=;
c[][]=c[][]=;
for(int i=;i<=n/;i++)
{
c[i][]=;
for(int j=;j<i;j++)
c[i][j]=(c[i-][j-]%r+c[i-][j]%r)%r; c[i][i]=;
}
}
void init()
{
memset(dp,,sizeof(dp));
dp[]=;
for(int i=; i<n/+; i++) //从前面开始更新到后面,2500还能更新5000的,所以要循环到n/2
{
for(int j=; j<=i; j++) //有j个2, i-j个3
{
int q=j*+(i-j)*; //要更新的点
dp[q]=(dp[q]+(dp[i]*c[i][j]))%r;
}
}
} int main()
{
//freopen("e://input.txt", "r", stdin);
while(~scanf("%d%d",&n,&r))
{
pre();
init();
printf("%lld\n",dp[n]);
}
return ;
}

AC代码

acdream 1412 2-3Trees (组合+DP)的更多相关文章

  1. CF 553A 组合DP

    http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ...

  2. ACdream 1412 DP+排列组合

    2-3 Trees Problem Description 2-3 tree is an elegant data structure invented by John Hopcroft. It is ...

  3. acdream 1409 Musical 状压DP

    链接:http://acdream.info/problem? pid=1409 题意:整个国家有n座城市,每座城市有三种粉丝. 第一种一周看一场音乐剧,挑选的音乐剧是已经在周围城市播放上演过的次数最 ...

  4. [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)

    3193: [JLOI2013]地形生成 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 459  Solved: 223[Submit][Status ...

  5. HDU4532(组合DP)

    题目:安排座位 解析:http://www.douban.com/note/269136472/ #include <iostream> #include <string.h> ...

  6. AGC 001E.BBQ Hard(组合 DP)

    题目链接 \(Description\) 给定长为\(n\)的两个数组\(a,b\),求\[\sum_{i=1}^n\sum_{j=i+1}^n\binom{a_i+a_j+b_i+b_j}{a_i+ ...

  7. HDU 4532 湫秋系列故事——安排座位 (组合+DP)

    湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  8. nyoj1076-方案数量 【排列组合 dp】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=1076 方案数量 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ...

  9. ACdream 1113 The Arrow (概率dp求期望)

    E - The Arrow Time Limit:1000MS     Memory Limit:64000KB     64bit IO Format:%lld & %llu Submit  ...

随机推荐

  1. 这个东西,写C++插件的可以用到。 RapidJSON —— C++ 快速 JSON 解析器和生成器

    点这里 原文: RapidJSON —— C++ 快速 JSON 解析器和生成器 时间 2015-04-05 07:33:33  开源中国新闻原文  http://www.oschina.net/p/ ...

  2. Nginx状态监控

    通过配置nginx.conf文件来实现对Nginx状态信息的监控. 1.配置nginx.conf vim /usr/local/nginx/conf/nginx.conf 再server块配置项中添加 ...

  3. HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

    题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有 ...

  4. Visual Studio 自定义控件不显示在工具箱

    工具=>选项=>Windows窗体设计器=>常规=>AutoToolBoxPopulate=>True

  5. (3)VS2010+Opencv-2.4.8的配置攻略

    这是windows平台上的东西,我为什么要写到安卓这一块呢 因为作者做的安卓方面的东西需要先在windows平台实现一下,所以就想写这篇东西,也参考了网上很多教程,不得不感叹,这些软件版本更新的太快. ...

  6. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  7. MVC中前台如何向后台传递数据------$.get(),$post(),$ajax(),$.getJSON()总结

    一.引言 MVC中view向controller传递数据的时候真心是一个挺让人头疼的一件事情.因为原理不是很懂只看一写Dome,按葫芦画瓢只能理解三分吧. 二.解读Jquery个Ajax函数 $.ge ...

  8. 540C: Ice Cave

    题目链接 题意: n*m的地图,'X'表示有裂痕的冰块,'.'表示完整的冰块,有裂痕的冰块再被踩一次就会碎掉,完整的冰块被踩一次会变成有裂痕的冰块, 现在告诉起点和终点,问从起点能否走到终点并且使终点 ...

  9. Android 图片异步加载的体会,SoftReference已经不再适用

      在网络上搜索Android图片异步加载的相关文章,目前大部分提到的解决方案,都是采用Map<String, SoftReference<Drawable>>  这样软引用的 ...

  10. 定制CentOS (Redhat AS 5.1)安装盘

    CentOS(Redhat)提供了一套完整的自动化安装机制,利用该机制,我们可以自己定制无人值守的自动安装光盘,也可以进行系统裁减,甚至可以以CentOS为基础制作自己软件系统的系统安装盘.以下全部内 ...