1369. 牛之关系谱

状态表示:

\(f(i,j)\):节点数为\(i\),高度不超过\(j\)的子树个数(定义成高度恰好为\(j\)不好计算)。

状态转移:

若左子树的节点数为\(k\),则右子树的节点数为\(i-k-1\)

\[f(i,j)=\sum_{k=1}^{i-2} f(k,j-1) \times f(i-k-1,j-1) \]

边界:

叶节点的节点数为\(1\),高度不超过\(1 \sim k\)

\[f(1,1\sim k)=1 \]

const int N=210,M=110;
int f[N][M];
int n,m;

int main()
{
    cin>>n>>m;
    
    for(int i=1;i<=m;i++) f[1][i]=1;
    
    for(int i=2;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=i-2;k++)
                f[i][j]=(f[i][j]+f[k][j-1] * f[i-k-1][j-1])%mod;
        
    cout<< (f[n][m]-f[n][m-1]+mod)%mod <<endl;
    //system("pause");
    return 0;
}
posted @ 2021-06-06 16:25  Dazzling!  阅读(43)  评论(0编辑  收藏  举报