十分巧妙的方法!也是看了题解才知道的。
我们自然地设出dp[i][j]
表示用
i
个点构成深度为
那就设dp[i][j]
表示用
i
个点构成深度小于等于
答案是dp[n][k]-dp[n][k-1]
。
#include <iostream>
#include <cstdio>
using namespace std;
int dp[205][105], n, k;
const int mod=9901;
int main(){
cin>>n>>k;
for(int i=1; i<=k; i++)
dp[1][i] = 1;
for(int l=1; l<=k; l++)
for(int i=3; i<=n; i+=2)
for(int j=1; j<i; j+=2)
dp[i][l] = (dp[i][l] + dp[j][l-1] * dp[i-j-1][l-1]) % mod;
cout<<(dp[n][k] - dp[n][k-1] + mod) % mod;
return 0;
}
真是妙解!