随机寻找简单题增加估值/kel
只需要记忆化搜索即可,搜索的时候枚举左右儿子的子树大小。如果左右儿子子树大小相同需要特判一下。
题目要求树的高度为 hhh,可以转化为高度小于等于 hhh 的方案数减去高度小于等于 h−1h-1h−1 的方案数。
cpp
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int t,n,h;
int dp[505][505];
int dfs(int x,int y)
{
if(y<0) return 0;
if(dp[x][y]) return dp[x][y];
if(x==0) return dp[x][y]=1;
if(y==0)
{
if(x<=1) return dp[x][y]=1;
return dp[x][y]=0;
}
for(int j=0;j<=x-1;j++)
if(x-1-j==j) dp[x][y]=(dp[x][y]+dfs(j,y-1)%mod)%mod;
else dp[x][y]=(dp[x][y]+dfs(j,y-1)*1ll*dfs(x-1-j,y-1)%mod)%mod;
return dp[x][y];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>h;
cout<<((dfs(n,h)-dfs(n,h-1))%mod+mod)%mod<<"\n";//防止负数出现
}
return 0;
}