PAT T1007 Red-black Tree

我们定义r[i][j] b[i][j]分别为以红色、黑色的点为根节点,black height为i,
internel node数量为j的情况下,所能形成的树的种数。

易知b[1][1] = 1; r[0][1] = 1; b[1][2] = 2;,
这是根节点具有null孩子结点的三种情况;

下面我们可以根据红黑树的性质得到具有非null孩子结点的根结点具有的递推公式:

红色结点必定有两个黑色结点的孩子:

r[i][j + 1] += b[i][k] * b[i][j - k];

而黑色结点可以有任意颜色结点的孩子:

b[i + 1][j + 1] += (r[i][k] + b[i][k]) * (r[i][j - k] + b[i][j - k])

由于是非null结点,这里的j + 1至少是3~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
const int mod=1e9+7;
long long r[maxn][maxn],b[maxn][maxn],N;
int main () {
    scanf ("%lld",&N);
    b[1][1]=1;
    r[0][1]=1;
    b[1][2]=2;
    for (int i=0;i<=8;i++) {
        for (int j=2;j<=N;j++) {
            for (int k=1;k<j;k++) {
                r[i][j+1]+=b[i][k]*b[i][j-k];
                r[i][j+1]%=mod;
                b[i+1][j+1]+=(r[i][k]+b[i][k])*(r[i][j-k]+b[i][j-k]);
                b[i+1][j+1]%=mod;
            }
        }
    }
    long long ans=0;
    for (int i=1;i<=8;i++) 
    ans+=b[i][N],ans%=mod;
    printf ("%lld",ans);
    return 0;
}

 

posted @ 2020-02-14 21:43  zlc0405  阅读(116)  评论(0编辑  收藏  举报