1. 程式人生 > >p1472 Cow Pedigrees

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深度。