codeforces 9D How many trees?(DP,注意状态表示方法)

原创 2013年12月03日 00:40:11

题目链接

分析:比较一下各种状态表示,

①dp[n][h] 若表示n个节点深度为h,需要枚举左右儿子的深度,则每次转移需要O(n*h^2),不够优; 

②若dp[n][h]表示n个节点深度大于等于h,转移时的条件是至少有一个儿子的深度大于等于h-1,发现转移略复杂,是:[“左儿子深度<h-1" * "右儿子深度>=h-1"]  +   [“左儿子深度>=h-1” * "右儿子深度<h-1"]  +  ["左儿子深度>=h-1" * "右儿子深度>=h-1"]  ,这三种情况的组合,深度小于h可以用“深度>=h” - "深度>=0" 代替 ,每次转移需要O(n) , 时间性能良好, 但编写略复杂;

③dp[n][h]表示n个节点深度小于等于h,此时答案为 dp[n][n] - dp[n][h-1] , 状态转移条件是两个儿子深度都小于等于h-1 , 只有一种情况,没次转移需要O(n) 

同过上面比较可知第三种表示方法,兼有时间复杂度和代码复杂度的优势。

附第三种方法的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
LL dp[40][40];

LL DP(int n,int h){
    if(dp[n][h]>=0) return dp[n][h];
    if(h==0) return dp[n][h] = n<=0 ? 1 : 0;
    if(n==0) return dp[n][h] = h>=0 ? 1 : 0;
    dp[n][h] = 0;
    for(int k=1;k<=n;k++){
        dp[n][h] += DP(k-1,h-1)*DP(n-k,h-1);
    }
    return dp[n][h];
}

int main()
{
    memset(dp,-1,sizeof(dp));
    int n,h;
    while(cin>>n>>h) cout<<DP(n,n)-DP(n,h-1)<<endl;
    return 0;
}



相关文章推荐

#9 (Div. 2 Only) D. How many trees? (dp)(好题)

题目链接: 点击打开链接 http://codeforces.com/contest/9/problem/D 题意: 规定一个二叉树,有n个节点,问你深度大于等于h的一共有多少种?这个...

codeforces #331 D. Wilbur and Trees (dp)

题目:http://codeforces.com/contest/596/problem/D 题意:有n棵高为h的树在一排,已知每棵树的位置pos。现在你从最左边或者从最右边等概率挑选一棵树砍断,树...
  • w20810
  • w20810
  • 2015年11月18日 19:33
  • 357

Codeforces Round #331 D. Wilbur and Trees(概率dp+区间dp)

题意:在一条直线上有n棵树,每棵树的高度都为h,每次等概率的砍掉最左边或最右边的树,一棵树如果被砍掉有p的概率向左倒下,有1-p的概率向右倒下,如果两树之间距离小于h,那么一颗树倒下后可以击中另一棵树...

uva 10303 How Many Trees?

uva 10303 How Many Trees?

HDU 1130 How Many Trees?(卡特兰数+大数)

HDU 1130 How Many Trees?(卡特兰数+大数)

ACM刷题之HDU————How Many Trees?

How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot...

UVa 10303 How Many Trees? (卡特兰数&高精度)

10303 - How Many Trees? Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_on...

hdu1130How Many Trees? 卡特兰数

#include using namespace std; //大数求解卡特兰数 打表法 //公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1) #define N...

hdu/hdoj 1130 How Many Trees?

卡特兰数; 就直接模板了 #include #include #include using namespace std; #define base 10000//数组一个单位存的是1000...

HDU 1130 How Many Trees?

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1130 题面: How Many Trees? Time Limit: 2000/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces 9D How many trees?(DP,注意状态表示方法)
举报原因:
原因补充:

(最多只允许输入30个字)