• 【Python3】【树形dp】uva10253 Series-Parallel Networks


    设“共n个叶子,且每个非叶节点至少有两个子节点”的树的数量为f[n],再乘2就是本题答案。

    设状态d(i,j)表示每棵子树最多包含i个叶子、一共有j个叶子的树的个数。于是f(n)=d(n-1,n)。假设恰好包含i个叶子的子树有p棵,那么这些树的组合数等于从f(i)棵树中选择p棵树的方案数,即C(f(i)+p-1,p),再去乘上剩下的(包含叶子树少于i的)子树的方案数d(i-1,j-p*i),因此d(i,j)=sum{C(f(i)+p-1,p)*d(i-1,j-p*i) | p>=0,p*i<=j}

    边界是:i>=0时d(i,0) = 1,i>=1时d(i,1) = 1,但d(0,i) = 0。

    def C(n, m):
        res = 1;
        for i in range(m):
            res *= (n-i);
        for i in range(1,m+1):
            res //= i;
        return res;
    
    f = [0] + [1] + [0] * 33;
    d = [([0] * 35) for i in range(35)];
    n = 30;
    for i in range(n+1):
        d[i][0]=1;
    for i in range(1,n+1):
        d[i][1]=1;
        d[0][i]=0;
    for i in range(1,n+1):
        for j in range(2,n+1):
            for p in range(0,j+1,i):
                d[i][j] += C(f[i]+p//i-1, p//i) * d[i-1][j-p];
        f[i+1] = d[i][i+1];
    while(True):
        n=int(input());
        if(n==0):
            break;
        if(n==1):
            print(1);
        else:
            print(2*f[n]);
  • 相关阅读:
    IM,游戏服务端 tcp 框架整理
    IronPython初体验和实战集合等类型转换和类型匹配
    C# 控件包
    ORM框架系列
    C# Excel或表格插件
    vue之修饰符
    vue之单表输入绑定
    vue之计算属性和侦听器
    vue之指令系统
    vue之用法
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/8842469.html
Copyright © 2020-2023  润新知