!HDU 4359 左子树节点和小于右子树的树有多少种-dp
来源:互联网 发布:淘宝企业店升级 编辑:程序博客网 时间:2024/04/30 14:05
题意:n个节点,每个节点的权值为2^0,2^1....2^(n-1),求满足任何节点的左子树的节点和小于右子树的节点和的分配方案有多少种
分析:
由于等比数列的性质:1+2+....2^(k-1)<2^k,所以除了根节点的权值以外的,最大值必须在右子树,其余节点随意。
情况有:1.只有左子树,2.只有右子树,3.都有
dp[i][j]:表示选i个节点深度<=j的树的分配方案
转移:dp[i][j]+=C(i-2,k)*dp[k][j-1]*dp[i-1-k][j-1],这里用到了组合数性质,或者说杨辉三角性质。
这题的dp还不是很懂。
代码:
#include<iostream>#include<cstring>#define INF 1000000007using namespace std;long long c[1000][1000],dp[400][400];int n,h;void init(){memset(dp,0,sizeof(dp));memset(c,0,sizeof(c));c[0][0]=1;for(int i=1;i<=360;i++){c[i][0]=1;c[i][i]=1;for(int j=1;j<i;j++){c[i][j]=(c[i-1][j-1]+c[i-1][j])%INF;}}for(int i=0;i<=360;i++) dp[0][i]=1;for(int j=1;j<=360;j++) dp[1][j]=1;for(int i=2;i<=360;i++){for(int j=1;j<=360;j++){dp[i][j]+=dp[i-1][j-1]*2%INF;dp[i][j]%=INF;for(int k=1;k<=i-2;k++){dp[i][j]+=c[i-2][k]*dp[k][j-1]%INF*dp[i-1-k][j-1]%INF;dp[i][j]%=INF;}dp[i][j]*=i;dp[i][j]%=INF;}}}int main(){init();int t;cin>>t;for(int cas=1;cas<=t;cas++){cin>>n>>h;long long ans=((dp[n][h]-dp[n][h-1])%INF+INF)%INF; cout<<"Case #"<<cas<<": "<<ans<<endl;}}
0 0
- !HDU 4359 左子树节点和小于右子树的树有多少种-dp
- 交换二叉树的左子树和右子树
- poj 3321 计算一个树的子树共有多少节点
- 判断满二叉树中有不同子树的节点有多少个
- 拷贝二叉树;交换二叉树中所有结点的左、右子树
- 将二叉树中所有结点的左、右子树相互交换
- 寻找节点和最大的子树
- 【HDU 3887】【dfs序+线段树】Counting Offspring 【查询子树上标号比它小的点有多少个 】
- hdu5326 树的子树节点个数 dfs
- 两棵树都是空树,或者非空且具有相似的左子树和右子树,则这两棵树是相似的。编写一个函数以确定是否两棵二叉树是相似的
- 404. Sum of Left Leaves | 所有左子树的和
- 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换。
- 面试题:输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换。
- 输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换:
- 6.36③ 若已知两棵二叉树B1和B2皆为空,或者皆 不空且B1的左、右子树和B2的左、右子树分别相似, 则称二叉树B1和B2相似。试编写算法,判别给定两 棵二叉树是否相似。
- 有一个二叉树, 节点全部为整数,如何找到一个子树,它所有节点的和最大?要求编程序实现。
- 二叉树的子树
- biTree 大数插入右子树,小数插入左子树,子函数create , insert
- 二叉查找树的基本操作
- QString与各种字符串之间的转化
- win7+opencv2.4.9+visualstudio2013
- 正则表达式
- 类的内存空间占用
- !HDU 4359 左子树节点和小于右子树的树有多少种-dp
- J114 8/4
- shell 学习笔记(转)
- docker logs 实现剖析
- Android Textview属性详解
- day04_循环结构_20150804
- DPDK 的 uio 以及 PMD 机制的实现
- 两个html页面之间传参
- 添加字符到字符串千万不能用+,用push_back