SP8549 MAIN75 - BST again题解

· · 题解

随机寻找简单题增加估值/kel

只需要记忆化搜索即可,搜索的时候枚举左右儿子的子树大小。如果左右儿子子树大小相同需要特判一下。

题目要求树的高度为 h,可以转化为高度小于等于 h 的方案数减去高度小于等于 h-1 的方案数。

#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;
}