bzoj3769

树形dp

%%%popoqqq

设dp[i][j]表示当前i个节点的树,深度小于等于j的树的个数

那么dp[i][j] = sigma(dp[k][j-1]*dp[n-k-1][j-1]) 比较好理解 然后记忆化搜索就行了

这个dp状态感觉挺巧妙的,以前没见过

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 610, mod = 1000000007;
int n, h, T;
ll dp[N][N];
ll dfs(int n, int h)
{
    if(n < 0 || h < 0) return 0;
    if(n == 0) return 1;
    if(h == 0) return n == 1;
    if(dp[n][h] != -1) return dp[n][h];
    ll ret = 0;
    for(int i = 0; i < n; ++i) ret = (ret + dfs(i, h - 1) * dfs(n - i - 1, h - 1)) % mod;
    return dp[n][h] = ret;
}
int main()
{
    memset(dp, -1, sizeof(dp));
    for(cin >> T; T; --T)
    {
        cin >> n >> h;
        cout << ((dfs(n, h) - dfs(n, h - 1)) % mod + mod) % mod << endl;
    }
    return 0;
}

时间: 2024-10-13 02:17:33

bzoj3769的相关文章

【BZOJ3769】spoj 8549 BST again DP(记忆化搜索?)

[BZOJ3769]spoj 8549 BST again 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<=60

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ