HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp
题意:
给定n deep
1、构造一个n个节点的带权树,且最大深度为deep,每一个节点最多仅仅能有2个儿子
2、每一个节点的值为2^0, 2^1 ··· 2^(n-1) 随意两个节点值不能同样
3、对于一个节点,若他有左右儿子,则左子树的和 < 右子树的和
问:
有多少种构造方法。
思路:
dp
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if(x>9) pt(x/10);
putchar(x%10+'0');
}
///////////////////////////////////
typedef long long ll;
const int N = 362;
const ll mod = 1000000000 + 7; int d[N][N], p[N][N], c[N][N];
int main() {
memset(d, 0, sizeof d);
memset(p, 0, sizeof p);
memset(c, 0, sizeof c);
for (int i = 0; i < N; ++i) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; ++j)
c[i][j] = (c[i - 1][j] + c[i-1][j-1]) % mod;
}
for (int i = 0; i < N; ++i)
p[0][i] = 1;
for (int i = 1; i < N; ++i)
p[1][i] = 1;
for (int i = 2; i < N; ++i)
for (int j = 1; j < N; ++j) {
p[i][j] += (ll)p[i-1][j-1] * 2 % mod;
p[i][j] %= mod;
if (i - 1 >= 2) {
for (int k = 1; k <= i - 2; ++k) {
p[i][j] += ((ll)c[i-2][k] * p[k][j-1] % mod) * p[i-1-k][j-1] % mod;
p[i][j] %= mod;
}
}
p[i][j] = (ll)p[i][j] * i % mod;
}
//int x, y; while (~scanf("%d%d", &x, &y)) printf("%d\n", p[x][y]);
d[1][1] = 1; d[0][0] = 1;
for (int i = 2; i < N; ++i)
for (int j = i; j < N; ++j) {
d[i][j] += (ll)2 * d[i-1][j-1] % mod;
d[i][j] %= mod;
if (j - 1 >= 2) {
for (int k = 1; k <= j - 2; ++k) {
d[i][j] += ((ll)c[j-2][k] * p[k][i-2] % mod) * d[i-1][j-1-k] % mod;
d[i][j] %= mod;
d[i][j] += ((ll)c[j-2][k] * d[i-1][k] % mod) * p[j-1-k][i-2] % mod;
d[i][j] %= mod;
d[i][j] += ((ll)c[j-2][k] * d[i-1][k] % mod) * d[i-1][j-1-k] % mod;
d[i][j] %= mod;
}
}
d[i][j] = (ll)d[i][j] * j % mod;
}
int T = 0, cas, u, v;
scanf("%d", &cas);
while (cas -- > 0) {
rd(u); rd(v);
printf("Case #");
pt(++T);
putchar(':');
putchar(' ');
pt(d[v][u]);
putchar('\n');
}
return 0;
}
HDU 4359 Easy Tree DP? 带权二叉树的构造方法 dp的更多相关文章
- HDU 4359——Easy Tree DP?——————【dp+组合计数】
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU 4359 Easy Tree DP?
Easy Tree DP? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU 4359 Easy Tree DP? 组合数学+动归
题意:定义一种树,每个节点的权值都是20到2n-1,每个权值出现一次,每个节点的左子树的权值和小于右子树,除非只有一个子树.给你n和d,问有n个节点且恰好深度是d的这种树有多少种. 比赛的时候我没有做 ...
- POJ1417:True Liars(DP+带权并查集)
True Liars Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 3074 Zjnu Stadium (带权并查集)
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 3047 Zjnu Stadium(带权并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=3047 题意: 给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的. 思路: ...
- 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分
题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...
- Codeforces.739E.Gosha is hunting(DP 带权二分)
题目链接 \(Description\) 有\(n\)只精灵,两种精灵球(高级和低级),每种球能捕捉到第\(i\)只精灵的概率已知.求用\(A\)个低级球和\(B\)个高级球能捕捉到精灵数的最大期望. ...
随机推荐
- makefile 学习一
近期在学习nginx,由于实在linux下,一些代码须要用makefile文件来编译,比較节省时间. 由于在nginx中加入一个新的模块假设用./configure方法来加入,特别是当你的代码有错时, ...
- 斯坦福ML公开课笔记14——主成分分析
上一篇笔记中,介绍了因子分析模型,因子分析模型使用d维子空间的隐含变量z来拟合训练数据,所以实际上因子分析模型是一种数据降维的方法,它基于一个概率模型,使用EM算法来预计參数. 本篇主要介绍PCA(P ...
- linux系统启动过程的列表
linux系统启动过程的列表 载入BIOS的硬件信息并进行自检.然后根据设置取得第一个可启动的设备: 读取并运行第一个启动设备内MBR(master boot record,主引导分区)的boot l ...
- ZTESoft 持续集成 编年史 之 持续集成探索---平台选择
2012 年 7.8 月份,我们逐渐了解了持续集成的概念,同时我们家庭作坊的dailybuild方式不断爆出各种问题,并且已经无法满足日益增长的各种需求. 我们开始探索持续集成的不同实现方式,首先我们 ...
- U7Linux文件与目录管理
1. .:代表当前层目录. ..:代表上一层目录. -:代表前一个工作目录. ~:代表目前用户所在的主文件夹. ~account:代表account这个用户的主文件夹. 2.pwd:显示当前目录. p ...
- DirectX11 学习笔记9 - 动态顶点缓冲区 和 静态顶点缓冲区
首先,什么是缓冲区: 缓冲区是.fx文件的影响(.ps .vs还) 一种数据结构,其定义了.为.fx和cpp数据通信文件. 例: //--------------------------------- ...
- Oracle SQL Lesson (6) - 使用Join进行联合查询
使用连接SQL 1999SELECT table1.column, table2.columnFROM table1[NATURAL JOIN table2] |[JOIN table2 USING ...
- [TroubleShooting]'trn\bak' is incorrectly formed. SQL Server cannot process this media family.
SQL Server online consultants came across an interesting scenario where one of our client was una ...
- Path相关评论的方法(一)
以前的主要是关于Canvas的translate(平移) .scale(缩放) .rotate(旋转) .skew(错切).接下来几篇主要讲下android里的Path(封装了贝塞尔曲线)& ...
- Linux如何用QQ?Linux下QQ使用的几种方案
在linux下如何使用QQ?在ubuntu11.10中如何使用QQ?或许有初涉linux的人这样问,我们可以看看ubuntusoft总结出来的几种在linux系统下用QQ的方法.前面的几种主要的方法都 ...