p1472 Cow Pedigrees

用dp[i][j]记录i个点,组成深度恰好为j的方案数。arr[i][j]记录i个点,深度<=j的方案数。那么dp[i][j]只有i为奇数时不为0。而arr[i][j]等于dp[i][j]的前缀和(i相同时)。而dp[i][j],i为奇数有值,等于左子树分奇数个,右子树分奇数个的所有情况,并且左子

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-8;
typedef long long lon;
const lon SZ=200030,INF=0x7FFFFFFF,mod=9901;
int dp[210][120],arr[210][120];

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //for(lon time=1;time<=casenum;++time)
    {
        int n,k;
        cin>>n>>k;
        for(int i=0;i<120;++i)arr[1][i]=1;
        dp[1][1]=1;
        for(int i=2;i<=n;++i)
        {
            if(i&1)
            for(int j=1;j<=k;++j)
            {
                for(int p=i-2;p>=1;p-=2)
                {
                    dp[i][j]+=2*dp[p][j-1]*arr[i-1-p][j-1]%mod;
                    dp[i][j]-=dp[p][j-1]*dp[i-1-p][j-1];
                }
                dp[i][j]%=mod;
                arr[i][j]=arr[i][j-1]+dp[i][j];
                arr[i][j]%=mod;
                //if(i==3)cout<<j<<" "<<dp[i][j]<<endl;
            }
        }
        cout<<(dp[n][k]+mod)%mod<<endl;
    }
    return 0;
}

 

树必须为j-1深度,或者右子树必须为j-1深度,减去两者同为j-1深度。

posted @ 2018-10-21 15:34  degvx  阅读(117)  评论(0)    收藏  举报