首页 > 其他分享 >2022.10.20-C 二叉树

2022.10.20-C 二叉树

时间:2022-10-24 09:56:38浏览次数:95  
标签:结点 20 int 括号 二叉树 return 2022.10 mod

题意

有一颗二叉树,满足一个结点要么是叶子结点,要么有两个儿子。同时,不存在一个叶子结点,使得它到根的路径上经过了 \(\ge m\) 条向左的边。(左右子树有区别)

对于 \(1\le k \le n\),求满足上述条件,且有 \(k\) 个叶子结点的二叉树,有多少个(\(\bmod~998244353\))

\(n,m\le 5000\)


思路

众所周知,一个有 \(k\) 个叶子结点的二叉树,其实就是有 \(2k-1\) 个结点。

因为一个非叶结点一定有两个儿子,那么我们可以将这个二叉树看成一个括号序列:

我们按照 dfs 序遍历整个二叉树,向左走就记录一个左括号,向右走就记录一个右括号。

那么一个合法二叉树就对应一个合法括号序列,长度为 \(2k-2\)。

如果我们将左括号看为 \(1\),右括号看为 \(-1\),对得到的括号序列求前缀和,那么一定是满足以下条件:

  • 任意时刻和 \(\ge 0\)

  • 最大的前缀和 \(< m\)

这样,我们就可以用 DP 来做了。

我们设 \(f_{i,j}\) 表示括号序列长度为 \(i\),前缀和为 \(j\) 的方案数。

转移显然有:

\[f_{i,j}=f_{i-1,j-1}+f_{i-1,j+1} \]


代码

#include<bits/stdc++.h>
#define LL long long
#define max(x...) std::max({x})
#define min(x...) std::min({x})
#define FOR(i, x, y) for(int i = (x); i <= (y); i++)
#define ROF(i, x, y) for(int i = (x); i >= (y); i--)
inline int rd()
{
    int sign = 1, re = 0; char c = getchar();
    while(!isdigit(c)){if(c == '-') sign = -1; c = getchar();}
    while(isdigit(c)){re = re * 10 + (c - '0'); c = getchar();}
    return sign * re;
}
namespace MOD
{
    const int mod = 998244353;
    inline int add(int a, int b) {return a + b >= mod ? a + b - mod : a + b;}
    inline int mul(int a, int b) {return 1ll * a * b % mod;}
    inline int sub(int a, int b) {return a - b < 0 ? a - b + mod : a - b;}
} using namespace MOD;
int n, m;
int f[10005][5005];
signed main()
{
#ifdef ONLINE_JUDGE
    freopen("tree.in", "r", stdin);
    freopen("tree.out", "w", stdout);
#endif
    m = rd() - 1, n = rd();
    f[1][0] = 1, puts("1");
    FOR(i, 2, (n << 1) - 1)
    {
        FOR(j, 0, m)
        {
            if(j < m) f[i][j] = add(f[i][j], f[i - 1][j + 1]);
            if(j > 0) f[i][j] = add(f[i][j], f[i - 1][j - 1]);
        }
        if(i & 1) printf("%d\n", f[i][0]);
    }
    return 0;
}

标签:结点,20,int,括号,二叉树,return,2022.10,mod
From: https://www.cnblogs.com/zuytong/p/16820516.html

相关文章

  • 2022-2023-1 20221317《计算机基础与程序设计》第九周学习总结
    作业信息这个作业属于哪个课程:首页-2022-2023-1-计算机基础与程序设计-北京电子科技学院-班级博客-博客园(cnblogs.com)这个作业的要求在:2022-2023-1《计算......
  • 2022.10.20-B 排序
    题意一个长为\(n\)的排列,第\(i\)个位置上的数是\(p_i\);花费\(a_i\)的代价将数字\(i\)移到任意位置;花费\(b_i\)的代价将数字\(i\)移到左端;花费\(c_i\)的......
  • 2022年XX百万职工技能大赛 XX区网络安全与信息管理员比赛 经验之谈
    本次有幸参加了一次,《百万职工技能大赛XX区网络安全与信息管理员比赛》分享下个人经验: 大赛标准:个人赛以国家职业技能标准中级工及以上职业资格等级的要求为基础,适当增......
  • Week - 2022/10/17~2022/10/23 周记
    Week-2022/10/17~2022/10/23周记???-2022/10/19-Wed.-17:55大抵是一些无病呻吟。某些程度上来说这或许就是我这周的状态了吧。。CSP2022还有一周多一点了,虽然这......
  • 2022.10.21 模拟赛小结
    2022.10.21模拟赛小结目录2022.10.21模拟赛小结更好的阅读体验戳此进入赛时思路T1CodeT2CodeT3CodeT4Code正解T2CodeT3T4UPDsssmzyAK了,zpair差一点AK了,我寄了。......
  • 2022.10.19 模拟赛小结
    2022.10.19模拟赛小结目录2022.10.19模拟赛小结更好的阅读体验戳此进入赛时思路T1CodeT2T3T4Code正解T1CodeT2T3T4CodeUPD(一场难度稍微低1丶丶的模拟赛,不过我太弱了,......
  • 2022.10.14 模拟赛小结
    2022.10.14模拟赛小结目录2022.10.14模拟赛小结题面PDF链接更好的阅读体验戳此进入赛时思路T1T2CodeT3CodeT4正解T1CodeT2CodeT3T4UPD大概是相对来讲补的比较全的一场......
  • Week - 2022/10/10~2022/10/16 周记
    Week-2022/10/10~2022/10/16周记Summary-2022/10/17Mon.11:56不要问我为什么又在下一周的周一才写上一周的总结。也不要为我为什么上周的总结这就结束了,懒。Day......
  • 2022年10月24日00:11:35
    越是年少的时候,越是懵懂的时期,越是勇敢,越是可以一往无前的追求自己想要的东西。越是经历的多,越是明白了越多道理,就越是胆小,畏缩,因为随着年纪的增长,要考虑的东西越来越多,要......
  • 2022陕西省赛
    链接:https://ac.nowcoder.com/acm/contest/44007B.Card前缀和#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;usingi128=__int128;voi......