SP8549 MAIN75 - BST again题解
随机寻找简单题增加估值/kel
只需要记忆化搜索即可,搜索的时候枚举左右儿子的子树大小。如果左右儿子子树大小相同需要特判一下。
题目要求树的高度为
#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;
}