HDU5629:Clarke and tree(DP,Prufer)
Description

Input

Output

Sample Input

Sample Output

Solution
题意:给你$n$个点,还有每个点的度数,问你任选$i(1\leq i \leq n)$个点构成树的方案数。
这种统计生成树的题,很容易想到用$prufer$序列搞。
$prufer$序列有一个很重要的性质,一个度数为$d$的点会在$prufer$序列里出现$d-1$次。
那么我们设$f[i][j][k]$表示$DP$完前$i$个点,选了其中的$j$个点,当前$prufer$序列长度为$k$。
不选:$f[i+1][j][k]+=f[i][j][k]$。
当前度数为$d+1$,也就是要把$d$个当前点插入到$prufer$序列里:$f[i+1][j+1][k+d]+=f[i][j][k]\times C[k+d][d]$。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define N (109)
#define MOD (1000000007)
using namespace std; int T,n,a[N],f[N][N][N],C[N][N]; void Preprocess()
{
C[][]=;
for (int i=; i<=; ++i)
for (int j=; j<=i; ++j)
{
if (j) (C[i][j]+=C[i-][j-])%=MOD;
(C[i][j]+=C[i-][j])%=MOD;
}
} int main()
{
Preprocess();
scanf("%d",&T);
while (T--)
{
memset(f,,sizeof(f));
scanf("%d",&n);
for (int i=; i<=n; ++i) scanf("%d",&a[i]);
f[][][]=;
for (int i=; i<=n; ++i)
for (int j=; j<=i; ++j)
for (int k=; k<=n-; ++k)
{
(f[i+][j][k]+=f[i][j][k])%=MOD;
for (int d=; d<=a[i+]-; ++d)
(f[i+][j+][k+d]+=1ll*f[i][j][k]*C[k+d][d]%MOD)%=MOD;
}
printf("%d",n);
for (int i=; i<=n; ++i) printf(" %d",f[n][i][i-]); puts("");
}
}
HDU5629:Clarke and tree(DP,Prufer)的更多相关文章
- HDU 5629 Clarke and tree dp+prufer序列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=562 题意: 求给每个节点的度数允许的最大值,让你求k个节点能组成的不同的生成树个数. 题解: 对于n ...
- [hdu5629]Clarke and tree
首先由一个神奇的序列叫做Purfer序列,他可以表示一棵树,且每个节点出现此时为度数-1(因此总长为n-2). 然后dp,用f[i][j][k]表示用前i个点中的j个点构成了一个长度为k的Purfer ...
- 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
[题目]#6395. 「THUPC2018」城市地铁规划 / City [题意]给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值 ...
- 96. Unique Binary Search Trees (Tree; DP)
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- TYOI Day1 travel:Tree dp【处理重复走边】
题意: 给你一棵树,n个节点,每条边有长度. 然后有q组询问(u,k),每次问你:从节点u出发,走到某个节点的距离mod k的最大值. 题解: 对于无根树上的dp,一般都是先转成以1为根的有根树,然后 ...
- HDU 4359 Easy Tree DP?
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- hdu 5464 Clarke and problem dp
Clarke and problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php ...
- Codeforces 442D Adam and Tree dp (看题解)
Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...
随机推荐
- MVC初级教程(一)
演示产品源码下载地址:http://www.jinhusns.com/Products/Download
- SQL SERVER TRIGGER 触发器
1.触发器简介 触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手动执行,而是由事件来触发.触发器是当对某一个表进行操作.例如:update.insert.delete这些操作的时候,系统会 ...
- Java基础——ArrayList与LinkedList(一)
一.定义 ArrayList和LinkedList是两个集合类,用于储存一系列的对象引用(references). 引用的格式分别为: ArrayList<String> list = n ...
- 【Tomcat】Tomcat集群session管理
网上资料汇总: 关于 tomcat 集群中 session 共享的三种方法 Tomcat7集群共享Session 基于redis进行统一管理
- 了解java虚拟机—垃圾回收算法(5)
引用计数器法(Reference Counting) 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器减1.只要对象A的引用计数器的 ...
- php命令行生成与读取配置文件
接着之前的文章:php根据命令行参数生成配置文件 ghostinit.php <?php class ghostinit{ static $v = 'ghost version is 1.1'; ...
- python序列函数
zip:序列并行处理 >>> name=['ghostwu','wukong','bajie'] >>> age=['] >>> sex=['ma ...
- python学习之老男孩python全栈第九期_day003知识点总结
1. int: i.bit_length(): 把i这个数转换成二进制所需最少的位数 2. bool: (1) 1比True的效率更高 (2) 空字符串(什么都没有)为False:非空字符串为True ...
- python-外观模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 外观模式又叫做门面模式.在面向对象程序设计中,解耦是一种推崇的理念.但事实上由于 ...
- HTML初学小技巧
01.让背景图不滚动IE浏览器支持一个 Body 属性 bgproperties,它可以让背景不滚动:〈Body Background="图片文件" bgproperties=&q ...