用dp[i][j]记录i个点,组成深度恰好为j的方案数。arr[i][j]记录i个点,深度<=j的方案数。那么dp[i][j]只有i为奇数时不为0。而arr[i][j]等于dp[i][j]的前缀和(i相同时)。而dp[i][j],i为奇数有值,等于左子树分奇数个,右子树分奇数个的所有情况,并且左子

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF,mod=;
int dp[][],arr[][]; int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//for(lon time=1;time<=casenum;++time)
{
int n,k;
cin>>n>>k;
for(int i=;i<;++i)arr[][i]=;
dp[][]=;
for(int i=;i<=n;++i)
{
if(i&)
for(int j=;j<=k;++j)
{
for(int p=i-;p>=;p-=)
{
dp[i][j]+=*dp[p][j-]*arr[i--p][j-]%mod;
dp[i][j]-=dp[p][j-]*dp[i--p][j-];
}
dp[i][j]%=mod;
arr[i][j]=arr[i][j-]+dp[i][j];
arr[i][j]%=mod;
//if(i==3)cout<<j<<" "<<dp[i][j]<<endl;
}
}
cout<<(dp[n][k]+mod)%mod<<endl;
}
return ;
}

树必须为j-1深度,或者右子树必须为j-1深度,减去两者同为j-1深度。

最新文章

  1. 【hive】——metastore的三种模式
  2. jQuery cbpContentSlider 滑动切换
  3. php连接和操作mysql数据库
  4. iOS 初步单元测试
  5. python模块之codecs
  6. 图像二值化----otsu(最大类间方差法、大津算法)
  7. POJ 1159 Palindrome(LCS)
  8. php定界符 &lt;&lt;&lt; 的作用及使用注意事项
  9. mac下和windows下清空DNS缓存
  10. 一个Shell小脚本——旋转的斜杠
  11. [HDUOJ1312]Red And Black (经典的DFS)
  12. 利用BGP虚拟下一跳实现链路负载均衡
  13. 2018-2019-1 20189208《Linux内核原理与分析》第八周作业
  14. CentOS 搭建git服务
  15. pandas和re中正则表达式的意思
  16. English trip EM2-LP-4B At School Teacher:Russell
  17. Js代码一些要素
  18. python框架之Django(2)-简单的CRUD
  19. 思科、华为、H3C命令对照表
  20. 跨域问题-jsonp

热门文章

  1. 部署phpmyadmin登录不进去
  2. delete指针
  3. c# 之 System.Type.GetType()与Object.GetType()与typeof比较
  4. asp.net core mvc 中在C# 代码中写 js 或html 文本
  5. 题解——洛谷P1962 斐波那契数列(矩阵乘法)
  6. Java基础【基本数据类型包装类、int与String 之间的相互转换】
  7. Docker run 出现问题如何调试?
  8. 51nod 1215 数组的宽度(单调栈)
  9. web前端知识总结
  10. Python安装第三方库的安装技巧