acdream 1412 2-3Trees (组合+DP)
题意: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)的更多相关文章
- CF 553A  组合DP
		http://codeforces.com/problemset/problem/553/A A. Kyoya and Colored Balls time limit per test 2 seco ... 
- ACdream 1412 DP+排列组合
		2-3 Trees Problem Description 2-3 tree is an elegant data structure invented by John Hopcroft. It is ... 
- acdream 1409 Musical 状压DP
		链接:http://acdream.info/problem? pid=1409 题意:整个国家有n座城市,每座城市有三种粉丝. 第一种一周看一场音乐剧,挑选的音乐剧是已经在周围城市播放上演过的次数最 ... 
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
		3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ... 
- HDU4532(组合DP)
		题目:安排座位 解析:http://www.douban.com/note/269136472/ #include <iostream> #include <string.h> ... 
- 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+ ... 
- HDU  4532  湫秋系列故事——安排座位 (组合+DP)
		湫秋系列故事——安排座位 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ... 
- nyoj1076-方案数量                【排列组合 dp】
		http://acm.nyist.net/JudgeOnline/problem.php?pid=1076 方案数量 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ... 
- ACdream 1113 The Arrow (概率dp求期望)
		E - The Arrow Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit ... 
随机推荐
- 思考 ”前端开发人员都在关注的 GitHub 资源“
			点这里 原文: 资源 免费的计算机编程类中文书籍 免费编程书籍 计算机科学论文 codeparkshare Python初学者书籍.视频.资料.社区推荐 Python资料汇总 app应用推荐 码农周刊 ... 
- 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”
			VS2012启动/加载项目出问题 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage, Microsoft.Visual ... 
- x86虚拟地址到物理地址的映射学习
			这里只谈分页管理的机制,也是目前最重要的内存管理机制. 最初的设计想法: 结构图如下: 页的尺寸是4KB,虚拟地址的前20位用于指定一个物理页,后12位用于访问页内偏移. 页表项的结构: 各个位的含义 ... 
- Struts2 Convention插件的使用(4)使用@Action注解返回json数据
			package com.hyy.action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.co ... 
- MyEclipse — Maven+Spring+Struts+Hibernate 整合 [学习笔记-3]
			引入Struts2 在pom.xml中加入jar包 <!-- struts2 --> <dependency> <groupId>org.apache.struts ... 
- 怎么修改mysql密码
			1.用root 进入mysql后mysql>set password =password('你的密码');mysql>flush privileges; 2.使用GRANT语句 mysql ... 
- Java 虚拟机体系结构
			众所周知,Java源代码被编译器编译成class文件.而并不是底层操作系统可以直接执行的二进制指令(比如Windows OS的.exe文件).因此,我们需要有一种平台可以解释class文件并运行它.而 ... 
- Java 数据结构之ArrayList
			ArrayList:数组队列,就是动态数组,可以动态的增加和减少元素.实现了ICollection和IList接口.灵活的设置数组的大小 具体的用法: 1.创建:ArrayList list = ne ... 
- USACO Section 2.2: Runaround Numbers
			简单题 /* ID: yingzho1 LANG: C++ TASK: runround */ #include <iostream> #include <fstream> # ... 
- Crypto API加密通信流程
			应用程序使用Crypto API进行加密通信的一般步骤如下: 1,include wincrypt.h 2,调用CryptAcquireContext()获得某个CSP模块中的密钥容器(key con ... 
