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 - 组合数学的更多相关文章

  1. Codeforces 9D How many trees? 【计数类DP】

    Codeforces 9D How many trees? LINK 题目大意就是给你一个n和一个h 问你有多少个n个节点高度不小于h的二叉树 n和h的范围都很小 感觉有无限可能 考虑一下一个很显然的 ...

  2. Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学

    https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...

  3. Codeforces Round #369 (Div. 2) C. Coloring Trees(简单dp)

    题目:https://codeforces.com/problemset/problem/711/C 题意:给你n,m,k,代表n个数的序列,有m种颜色可以涂,0代表未涂颜色,其他代表已经涂好了,连着 ...

  4. Codeforces - 706B - Interesting drink - 二分 - 简单dp

    https://codeforces.com/problemset/problem/706/B 因为没有看见 $x_i$ 的上限是 $10^5$ ,就用了二分去做,实际上这道题因为可乐的价格上限是 $ ...

  5. codeforces 710E Generate a String(简单dp)

    传送门:http://codeforces.com/problemset/problem/710/E 分析: 让你写一个全由"a"组成的长为n的串,告诉你两种操作,第一种:插入一个 ...

  6. 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 ...

  7. Codeforces Round #260 (Div. 1) A. Boredom (简单dp)

    题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. BUPT复试专题—求导数(2015)

    题目描述 描述:求函数f(x) = a*x^3 + b*x^2 + c*x + d在x = x0处的一阶导数.   输入 数据第一行是数据的组数m 接下来m行的每一行分别是 a b c d x0 输出 ...

  2. js正則表達式:验证邮箱格式、password复杂度、手机号码、QQ号码

    $(function () { $("input[name='sub']").on("click", function () { if (!isEmail($( ...

  3. CMS - tabBar

    Tips:如果网页图片(文字)看不清,请按CTRL+鼠标滚轮 1.建议使用阿里图库 或者 easyicon 2.建议使用81*81且低于40KB的图片(建议jpg) 3.如需查看脑图结构,请点击:ta ...

  4. apache多网站配置

    前言  虽说apache安装好后给了我们一个默认的一个网站.并且我们还能够将这个默认的网站改动成我们自己的网站.可是这似乎还不能全然满足我们的须要,由于当我们要在本机上开发(phpWeb)或者測试另外 ...

  5. MongoDB---出现no write has been done on this connection解决方式

    no write has been done on this connection 这个问题出现了好几天.日志里面一天出现几十次no write has been done on this conne ...

  6. Go fsm

    package fsm import ( "log" ) type EvtIf interface { GetEvtType() string } type Action inte ...

  7. IO模型:同步、异步、阻塞、非阻塞

    前言: 在Linux的网络编程中,同步IO(synchronous IO).异步IO(asynchronous IO).阻塞IO(blocking IO).非阻塞IO(non-blocking IO) ...

  8. Screen 状态栏配置

    http://havee.me/linux/2010-08/screen-status-bar.html Screen 状态栏配置 GNU 的 screen 是一个很好的工具.如果需要经常或者大量的登 ...

  9. java使用默认线程池踩过的坑(三)

    云智慧(北京)科技有限公司 陈鑫 重新启动线程池 TaskManager public class TaskManager implements Runnable { -.. public TaskM ...

  10. HDOJ1006

    #include <cstdio>#include <algorithm>using namespace std;const double UB=43200;const dou ...