G - 2-3 Trees (dp)

点击打开链接

求一个含有l个子节点的2,3树一共有多少种形态,对结果取余r

因为我们知道最底层(叶子节点)的个数,所以我们可以向上推导,这n个叶子能组成多少个2孩子父节点和3孩子父节点,一层一层向上推导。同时每一层的2子父节点与3子父节点的排列也是造成形态多样的原因。

所以 dp[n]=dp[n]+dfs(i+t)*c[i+t][t]

dfs(i+t)表示子节点数为i+t的种类 

c[i+t][t]是组合数 表示从i+t中取出t个的方法个数

#include 
#include 
#include 
#include 
#include 
#include 
typedef long long ll;
using namespace std;

ll n,mod;
ll dp[5005];
ll c[2505][2505];

void init()
{
    c[0][0]=1;
    c[1][0]=1;
    c[1][1]=1;
    for(int i=2;i<=n/2;i++)
    {
        c[i][0]=c[i][i]=1;
        for(int j=1;j>n>>mod)
    {
        init();
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        dp[1]=1;
        dp[2]=1;
        dp[3]=1;
        printf("%lld\n",dfs(n));
    }
}


你可能感兴趣的:(姗姗杯,dp,算法)