博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3769:BST again(记忆化搜索DP)
阅读量:6866 次
发布时间:2019-06-26

本文共 1096 字,大约阅读时间需要 3 分钟。

Description

求有多少棵大小为n的深度为h的二叉树。(树根深度为0;左右子树有别;答案对1000000007取模)

Input

第一行一个整数T,表示数据组数。
以下T行,每行2个整数n和h。

Output

共T行,每行一个整数表示答案(对1000000007取模)

Sample Input

2
2 1
3 2

Sample Output

2
4

HINT

对于100%的数据,1<=n<=600,0<=h<=600,1<=T<=10

Solution

$f[i][j]$表示树大小为$i$,最深深度小于等于$j$的二叉树数量。
$f[i][j]=\sum_{k=1}^{i}f[k-1][j-1]*f[i-k][j-1]$
多组数据用记搜

Code

1 #include
2 #include
3 #include
4 #define N (609) 5 #define MOD (1000000007) 6 using namespace std; 7 8 int T,n,h,f[N][N],ans; 9 10 int DP(int sz,int hi)11 {12 if (sz==0) return 1;13 if (hi==0) return sz==1;14 if (f[sz][hi]!=-1) return f[sz][hi];15 f[sz][hi]=0;16 for (int i=1; i<=sz; ++i)17 (f[sz][hi]+=1ll*DP(i-1,hi-1)*DP(sz-i,hi-1)%MOD)%=MOD;18 return f[sz][hi];19 }20 21 int main()22 {23 memset(f,-1,sizeof(f));24 scanf("%d",&T);25 while (T--)26 {27 scanf("%d%d",&n,&h);28 ans=DP(n,h);29 if (h>0) ans-=DP(n,h-1);30 printf("%d\n",(ans%MOD+MOD)%MOD);31 }32 }

转载于:https://www.cnblogs.com/refun/p/9789405.html

你可能感兴趣的文章
STL algorithm源代码:stl_algo.h
查看>>
VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs
查看>>
Linux下文件重命名、创建、删除、修改及保存文件
查看>>
判断IP是否为爬虫IP
查看>>
Linux 内核使用的 GNU C 扩展
查看>>
Android 之 用WebView显示网页
查看>>
go——搭建Win7下的Go开发环境
查看>>
ubuntu14.04 中国源
查看>>
学一学书里的django是怎么写views.py的
查看>>
微信支付开发(8) 刷卡支付
查看>>
scriptcs简介
查看>>
ajax-原理分析
查看>>
【leetcode】Jump Game I, II 跳跃游戏一和二
查看>>
【ML入门系列】(三)监督学习和无监督学习
查看>>
springboot 配置jsp支持
查看>>
window.open实现模式窗口
查看>>
椭圆曲线密码体制(ECC)简介
查看>>
Mac OS 终端利器 iTerm2
查看>>
使用贝塞尔曲线进行插值 一种非常简单的平滑多边形的方法
查看>>
WebMvcConfigurerAdapter已经过时的问题解决
查看>>