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复试专题—进程管理(2014网研)

    题目描述 在操作系统中,进程管理是非常重要的工作.每个进程都有唯一的进程标识PID.每个进程都可以启动子进程,此时我们称该它本身是其子进程的父进程.除PID为0的进程之外,每个进程冇且只冇一个父进程. ...

  2. DevExpress2011控件教程)编辑控件(comboBox,AspxCheckBox) 范例1

    DevExpress2011控件教程)编辑控件(comboBox,AspxCheckBox) 范例1 AspxCheckBox 是一个检查编辑控件去展示特殊条件是否关闭或者打开.它一般会展示Yes/N ...

  3. android项目笔记(一)

    1.getInstance:单例模式创建类的实例,getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是s ...

  4. HTML的常用标签和表格

    拼接多个网页

  5. 细说linux IPC(三):mmap系统调用共享内存

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途]         前面讲到socket的进程间通 ...

  6. 笔记整理--LibCurl开发

    LibCurl开发_未了的雨_百度空间 - Google Chrome (2013/7/26 21:11:15) LibCurl开发 一:LibCurl 编程流程1.调用curl_global_ini ...

  7. scrollTo(String text) and scrollToExact(String text) method of Android Driver not working

    Using the scrollTo(String text) and scrollToExact(String text) method of Android Driver. However the ...

  8. split+ Pattern切割字符串

    今天在对一个String对象进行拆分的时候,总是无法到达预计的结果.呈现数据的时候出现异常,后来debug之后才发现,错误出在String spilt上,于是开始好好研究下这东西,开始对api里的sp ...

  9. 线程安全 对StringBuilder抛出ArrayIndexOutOfBoundsException的探究

    对StringBuilder抛出ArrayIndexOutOfBoundsException的探究 - CSDN博客 https://blog.csdn.net/liu_005/article/det ...

  10. Java异步套接字实例

    服务端 package com.test.server; import java.io.IOException; import java.net.InetSocketAddress; import j ...