Codeforces - 9D - How many trees? - 简单dp - 组合数学
https://codeforces.com/problemset/problem/9/D
一开始居然还想直接找公式的,想了想还是放弃了。原来这种结构是要动态规划。
状态是知道怎么设了,$t_{nh}$ 表示节点数为n个,树高为h的BST的个数。
为什么要这么设状态呢?是考虑到题目关心BST的高度,而且BST具有递归性。
但是这个关键就是要加上n个节点的标记,因为不同节点数量明显可以构造出的高为h的树不同,而且也会影响BST另一侧的构造。
所以说设对状态就做对了一半。
思路就是按高为h的BST是怎么由高为 $h-1$ 的BST加上根节点转移过来的,重点是向上转移而不是向下转移。
首先你要分类讨论,这个根节点的数字是 $m$ ,那么左边会有 $1 \thicksim m-1$ 共 $m-1$ 个节点,右边则有 $n-m$ 个节点,然后分
1.左子树的高是 $h-1$ ,右子树的高是 $0 \thicksim h-1$ (假如可以放得下的话)。
2.右子树的高是 $h-1$ ,左子树的高是 $0 \thicksim h-2$ (注意是h-2,否则和上面重复)
左右子树的构造是独立的,所以相乘。两种情况的分类的,所以相加。
最后遍历一遍 $m$ 得到所有 $t_{nh}$ 的和。

最后在自己做的时候,犯了几个小问题,首先就是 $m$ 的意思,定义中是指 $root$ 的值,写的时候变成的左子树的节点数,所以挂了。其次是 $t_{11}$ 虽然是平凡情况但是我用 $+=$ 运算的话会出毛病。第三是题目要求的是高度不小于 $h$ 的 $n$ 节点BST的总数,那么应该是 $sum(n,maxh=n)-sum(n,maxh=h-1)$ 。
#include<bits/stdc++.h>
using namespace std;
#define ll long long unsigned ll t[][]={}; unsigned ll sum(int n,int maxh){
unsigned ll res=;
for(int i=;i<=maxh;i++){
res+=t[n][i];
}
//printf("sum(t[n=%d][maxh=%d])=%llu\n",n,maxh,res);
return res;
} int n,h;
void solve(){
t[][]=;
//空树也是1种情况,因为要算乘法
for(int i=;i<=n;i++){
t[i][]=;
t[][i]=;
//这两种树不可能构造
} for(int ni=;ni<=n;ni++){
for(int hi=;hi<=n;hi++){
if(ni<hi)
continue;
for(int m=;m<=ni;m++){
t[ni][hi]+=t[m-][hi-]*sum(ni-m,hi-); //printf("t[%d][%d]+=%llu*%llu\n",ni,hi,t[m-1][hi-1],sum(ni-m,hi-1));
t[ni][hi]+=sum(m-,hi-)*t[ni-m][hi-];
}
//printf("t[%d][%d]=%llu\n",ni,hi,t[ni][hi]);
}
}
} int main(){
scanf("%d%d",&n,&h);
solve();
unsigned ll ans=;
ans=sum(n,n)-sum(n,h-);
printf("%llu\n",ans);
}
Codeforces - 9D - How many trees? - 简单dp - 组合数学的更多相关文章
- Codeforces 9D How many trees? 【计数类DP】
Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...
- Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学
https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...
- Codeforces Round #369 (Div. 2) C. Coloring Trees(简单dp)
题目:https://codeforces.com/problemset/problem/711/C 题意:给你n,m,k,代表n个数的序列,有m种颜色可以涂,0代表未涂颜色,其他代表已经涂好了,连着 ...
- Codeforces - 706B - Interesting drink - 二分 - 简单dp
https://codeforces.com/problemset/problem/706/B 因为没有看见 $x_i$ 的上限是 $10^5$ ,就用了二分去做,实际上这道题因为可乐的价格上限是 $ ...
- codeforces 710E Generate a String(简单dp)
传送门:http://codeforces.com/problemset/problem/710/E 分析: 让你写一个全由"a"组成的长为n的串,告诉你两种操作,第一种:插入一个 ...
- Codeforces Round #369 (Div. 2) C. Coloring Trees(dp)
Coloring Trees Problem Description: ZS the Coder and Chris the Baboon has arrived at Udayland! They ...
- Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...
- codeforces Gym 100500H A. Potion of Immortality 简单DP
Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...
- Codeforces Round #302 (Div. 2) C. Writing Code 简单dp
C. Writing Code Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/prob ...
随机推荐
- nexus批量更新jar包
nexus批量更新jar包 学习了:https://blog.csdn.net/newtelcom/article/details/54379607 手动进行jar包的拷贝,在维护界面内进行批量更新:
- 【数据库摘要】6_Sql_Inner_Join
INNER JOIN 操作符 INNER JOIN keyword在表中存在至少一个匹配时返回行. SQL INNER JOIN 语法 SELECT column_name(s) FROM table ...
- [AngularJS + Unit Testing] Testing a component with requiring ngModel
The component test: describe('The component test', () => { let component, $componentController, $ ...
- CSS3中transition-duration參数对hover前后两种过渡时间的影响
transition-duration这个參数是设置过渡时间的,将transition-duration放在哪个类中.那么在这个类被启用时就会依照transition-duration设定的时间来过渡 ...
- 【转载】读懂IL代码就这么简单(二)
一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...
- TinyXML:TiXmlNode
TiXmlNode: 对应于DOM结构中的节点,是TinyXML中很重要的一个类,它继承自TiXmlBase TiXmlNode的友元类: friend class TiXmlDocument; fr ...
- JAVA BigDecimal 高精度运算
文章参考一位博友,由于时间太久忘了链接,见谅! public class BigDecimalUtils { private static final int DIV_SCALE = 10;// 除法 ...
- mysql 环境变量之 group_concat_max_len
今天使用mysql group_concat()函数,对查询的数据进行字符串连接操作. 不过由于查询的结果较多,连接后的结果很长导致不能完全显示. 查询手册发现如下说明: (先说说group_conc ...
- mysql关闭skip-grant-tables快速重置mysql密码
如果你忘记了mysql密码几乎是没有什么好办法可以直接修改密码了,但我们可以在my.ini把加上skip-grant-tables,然后重启mysql就不需要密码了,这时我们再修改root密码,最后再 ...
- 一个动态库连续注册的windows脚本regsvr32
cmd ->for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1