题意:定义一种树,每个节点的权值都是20到2n-1,每个权值出现一次,每个节点的左子树的权值和小于右子树,除非只有一个子树。给你n和d,问有n个节点且恰好深度是d的这种树有多少种。

比赛的时候我没有做出来,当时A的人还是不少,\

有一个超傻逼的居然没想到,就是  ,这表示一个权值较大的节点是大于所有权值小于他的值之和的。

所以对于每一个合法的树,只要把权值最大的放到右子树就可以满足了。

动归过程:f[i][j]表示i个节点深度不超过j的方案种数。

for (int i = ; i <= N; i++){
for (int j = ; j <= N; j++){
f[i][j] = ( * i * f[i - ][j - ]) % MOD;
for (int k = ; k < i - ; k++){
f[i][j] = (f[i][j] + ((C[i][i - ] * C[i - ][k]) % MOD) * ((f[k][j - ] * f[i - k - ][j - ]) % MOD)) % MOD;
}
}
}

对于根节点分两种情况,只有一个子树,或者左右子树都有。

如果只有一个子树,那么f[i][j] = i * f[i-1][j-1] * 2。 意思就是任取一个节点做根节点,然后把满足条件的f[i-1][j-1]作为根节点的子树,左右两个子树所以再乘以2.

如果左右子树都有,情况稍微麻烦一点,那么就枚举左子树中的节点个数k,1≤k≤i-2,对于每一个k,还是任选一个节点做根节点,然后在除了根节点和剩下的最大值外的i-2个点中选k个到左子树,剩下的自然就到右子树了。这是节点的分配,那方案数呢,左子树有k个节点,深度不超过j-1,就是f[k][j-1],右子树有i-k-1各节点,深度同样不超过j-1,就是f[i-k-1][j-1],然后将这些乘起来就得到总的方案数了,所以有了下面总的状态转移方程。

f[i][j] = 2*i*f[i - 1][j - 1] + (i*C[i - 2][k]*f[k][j - 1]*f[i - k - 1][j - 1])(1≤k≤i-2)

其实还是蛮简单的啊,为什么当时不会做呢???智商被压制的感觉特别不爽

 #include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define LL long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define OPEN_FILE
#define MAXN 400
using namespace std;
LL f[MAXN][MAXN], C[MAXN][MAXN];
const LL MOD = 1e9 + ;
const int N = ;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
memset(C, , sizeof(C));
C[][] = ;
for (int i = ; i <= N; i++){
C[i][] = ;
for (int j = ; j <= i; j++){
C[i][j] = (C[i - ][j - ] + C[i - ][j]) % MOD;
}
}
memset(f, , sizeof(f));
for (int i = ; i <= N; i++){
f[][i] = ;
}
for (int i = ; i <= N; i++){
for (int j = ; j <= N; j++){
f[i][j] = ( * i * f[i - ][j - ]) % MOD;
for (int k = ; k < i - ; k++){
f[i][j] = (f[i][j] + ((i * C[i - ][k]) % MOD) * ((f[k][j - ] * f[i - k - ][j - ]) % MOD)) % MOD;
}
}
}
int T;
scanf("%d", &T);
int n, d;
for (int cas = ; cas <= T; cas++){
scanf("%d%d", &n, &d);
printf("Case #%d: %I64d\n", cas, (f[n][d] - f[n][d - ] + MOD) % MOD);
}
return ;
}

HDU 4359 Easy Tree DP? 组合数学+动归的更多相关文章

  1. HDU 4359——Easy Tree DP?——————【dp+组合计数】

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. HDU 4359 Easy Tree DP?

    Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  3. HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp

    题意: 给定n deep 1.构造一个n个节点的带权树,且最大深度为deep,每一个节点最多仅仅能有2个儿子 2.每一个节点的值为2^0, 2^1 ··· 2^(n-1)  随意两个节点值不能同样 3 ...

  4. HDU 4832 Chess(DP+组合数学)(2014年百度之星程序设计大赛 - 初赛(第二轮))

    Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,“王”在棋盘上的走法遵循十字路 ...

  5. HDU 5379 Mahjong tree dfs+组合数学

    题意:给你一棵树来分配号码,要求是兄弟节点连续并且每一棵子树连续. 思路:因为要求兄弟和子树都是连续的,所以自己打下草稿就可以发现如果一个节点有3个或3个以上的非叶子结点,那么就无论如何也不能达到目的 ...

  6. 【dp】动归总结

    原标题:[DP专辑]ACM动态规划总结 转载自 http://blog.csdn.net/cc_again?viewmode=list http://blog.csdn.net/cc_again/ar ...

  7. HDU 5513 Efficient Tree

    HDU 5513 Efficient Tree 题意 给一个\(N \times M(N \le 800, M \le 7)\)矩形. 已知每个点\((i-1, j)\)和\((i,j-1)\)连边的 ...

  8. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  9. 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)

    [BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...

随机推荐

  1. redis 多实例监控

    1.制作redis_low_discovery.sh脚本 mkdir -p /data/service/script/zabbix cd /data/service/script/zabbix cat ...

  2. HDU 4965 Fast Matrix Calculation 矩阵乘法 乘法结合律

    一种奇葩的写法,纪念一下当时的RE. #include <iostream> #include <cstdio> #include <cstring> #inclu ...

  3. Mysql写出高质量的sql语句的几点建议

    CleverCode在实际的工作也写过一些低效率的sql语句.这些语句会给数据库带来非常大的压力.最基本的表现就是sql语句执行慢,后来逐渐的去优化和尝试. 总结了一些高质量的sql语句的写法.这里C ...

  4. Java实现斐波那契数列Fibonacci

    import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO ...

  5. powershell输出错误信息到文件

    https://stackoverflow.com/questions/8925323/redirection-of-standard-and-error-output-appending-to-th ...

  6. springboot actuator shutdown正确的关闭操作

    今天整合ehcache时发现一个很重要的问题,就是程序关闭(硬关闭)之后,持久化到磁盘的缓存数据没能正确写入加载,问题还是硬关闭的问题,所以就使用actuator 进行监听 <dependenc ...

  7. 安卓开发--HttpClient

    package com.zx.httpclient01; import android.app.Activity; import android.os.Bundle; import android.v ...

  8. bzoj3252: 攻略 优先队列 并查集 贪心

    考场上自己yy出来的做法..... Code: #include<cstdio> #include<algorithm> #include<queue> #incl ...

  9. [NOIP2015提高组]运输计划

    题目:BZOJ4326.洛谷P2680.Vijos P1983.UOJ#150.codevs4632.codevs5440. 题目大意:有一棵带权树,有一些运输计划,第i个运输计划从ai到bi,耗时为 ...

  10. iotop---监控磁盘I/O 使用状况

    iotop命令是一个用来监视磁盘I/O使用状况的top类工具.iotop具有与top相似的UI,其中包括PID.用户.I/O.进程等相关信息.Linux下的IO统计工具如iostat,nmon等大多数 ...