思路:区间dp。
状态:dp[i][j]表示节点为i,高度小于等于j的方案数。
状态转移:dp[i][j]=∑dp[k][j-1]*dp[i-1-k][j-1]。
节点为i,高度等于j的方案数等于dp[i][j]-dp[i][j-1]。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define pi acos(-1.0) #define pii pair<int,int> #define mem(a,b) mam(a,b,sizeof(a)) const int MOD=9901; const int N=305; const int M=105; int dp[N][M]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,m; cin>>n>>m; for(int j=1;j<M;j++)dp[1][j]=1; for(int i=3;i<N;i+=2) { for(int j=1;j<M;j++) { for(int k=1;k<=i-2;k+=2) { dp[i][j]=(dp[i][j]+dp[k][j-1]*dp[i-1-k][j-1])%MOD; } } } cout<<(dp[n][m]-dp[n][m-1]+9901)%MOD<<endl; return 0; }