大家一起数二叉树

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值