1.我们知道二叉树的访问一般都涉及到动态规划,因为左子树还有左右子树,用动态规划可以节省开销
这一题思路差不多也是动态规划用一个dp[i][j]存信息,i是有多少节点,j是有多少叶子节点,显然j<i;
动态规划一般要有一个初始值,由初始值推出其他,还要有状态转换方程,首先初始值d【0】【0】=1表示根节点是叶子节点,
dp【1】【1】=1表示如果节点为1和没有节点是一样的;
我们知道如果左边有x个节点,左边有y个叶子节点,那么右边就有
i-x-1个节点,j-y个叶子节点,那么状态转换方程就出来了
dp[i][j]=dp[i][j]+dp[i-x-1][j-y]*dp[x][y];`
#include<iostream>
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int main()
{ int n,m;
long long dp[51][51]={};
dp[0][0]=1;
dp[1][1]=1;
for(int i=2;i<51;i++)
for(int j=1;j<=i;j++)
for(int x=0;x<=i-1;x++)
for(int y=0;y<=j;y++)
{
dp[i][j]=(dp[i][j]+dp[i-x-1][j-y]*dp[x][y])%mod;
}
while(cin>>n>>m)
{
cout<<dp[n][m]<<endl;
}
}