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深度。
浙公网安备 33010602011771号