【17 提高 1】 给

背景描述

对于任意 1≤k≤n, 求有多少个左右区分的恰有 k 个叶子节点的二叉树, 满足对于每个节点要么没有叶子节点要么有两个节点, 同时不存在一个叶子节点, 使得根到它的路径上有不少于 m 条向左的边。

你只需要求出答案对 998244353 取模的结果。

输入格式

输入共一行,两个正整数 m, n。

输出格式

输出 n 行每行一个整数, 第 i 行输出恰有 i 个叶子节点的时候的答案对 998244353 取模的结果。

样例输入

3 5

样例输出

11248

数据规模和约定

对于 20% 的数据, n,m≤8

对于 35% 的数据, n,m≤300

对于 60% 的数据, n,m≤1500

对于 100% 的数据, 1≤n,m,≤5000

题目信息

题目类型:传统型

输入文件:标准输入

输出文件:标准输出

时间限制:1 s

空间限制:512 MB

样例解释

样例一:

样例二

样例三

共两种

样例四:

共四种

性质

1.图是可以一步步附加上去的(根据叶子节点的个数在原来的方案上继续添加节点,每一个状态都可以从上一个状态转移过来),可以用树形DP。

2.在前一个图上加新的叶子节点一次必须加两个,不能只加一个,没加一次都要注意有没有超过m 条向左的边。

由此,我们可以设置dp[ i ] [ j ],表示叶子节点个数为i个时,向左的边最大个数为j的方案数。

这道题如果要暴力的话也是要考虑树的形状,那么理所当然就能想到DP,所以暴力的想法被舍弃了。

DP

1.顺着原先方案的一边下去

f[i + 1] [j + 1] = (f[i + 1] [j + 1] + f[ i ] [ j ]) % mod;

2.左右调换

f[i] [j - 1] = (f[i] [j - 1] + f[i] [j]) % mod

思路总结

我们先是看出了这是DP,然后确立了DP的数组,我们需要维护什么就设什么数组f[i] [j],表示叶子节点个数为i个时,向左的边最大个数为j的方案数。 (需要维护叶子节点个数,向左的最大边数)

对于每种状态如何转移,用集合的思想去分析,也是这道题最难的地方。

首先这道题与其他的常见题目不同,它有左右的区分,状态转移方程1是容易想的,方程2则不容易想到。我们一般用集合法去分析,往往都是由后到前,但这样想适合多(前一个状态)对一(后一个状态)的情况,但在本题中,我们要用f[i] [j]去想f[i + 1] [j + 1],又要用f[i] [j]去想f[i] [j - 1]。属于一(前一个状态)对多(后一个状态)。由此可见考虑集合法要完整慎重。

DP最关键的地方在于对自己要维护的东西有清楚的认知,什么时候都不能丢,才能确立完整正确的状态转移方程,难怪有人说DP是优雅的暴力。

注意事项

状态转移时,注意数据不能提前更新,避免转移发生冲突。

代码

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int maxn=5005;
const int maxm=5005;
int add(int x)
{return x >= mod ? x - mod : x;
}
int m,n;
int f[maxn][maxm];
void dp()
{f[1][1]=1;for(int i=1;i<=n;++i){int lim=min(i,m);for(int j=lim;j>=1;--j)//防止更新顺序混乱(覆盖)。{f[i][j-1]=add(f[i][j-1]+f[i][j]);f[i+1][j+1]=add(f[i+1][j+1]+f[i][j]);}}
}
int main()
{scanf("%d%d",&m,&n);dp();for(int i=1;i<=n;++i){printf("%d\n",f[i][1]);}return 0;
}

【17 提高 1】 给相关推荐

  1. 2018.8.17提高B组模拟考试

    今天,是一个重要的日子. (想什么呢?我说的当然是那位大人的生日啦) T1 题意简述:jzoj3223 Description Input Output 输出 q行,第 i行输出对于第 i个询问的答案 ...

  2. jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】

    正题 题目大意 n∗nn*nn∗n的矩形,每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上.如果没有就失败了,求必胜方. 解题思路 如果场地上有一个位置堵上后即可堵上所有 ...

  3. jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】

    正题 题目大意 开始暴击率为xxx,每次失败后都会增加xxx,成功后重置,然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ans ...

  4. 【ZROI】【贪心】【DP】【17 提高 4】怪物猎人

    假设我们已经确定了要杀那几只怪,假设第i只怪在第j天被杀死,那么它对猎人造成的伤害就是 (a[i]+j∗d)(b[i]+j∗d)=a[i]∗b[i]+j2d2+j∗d∗(a[i]+b[i]) ( a ...

  5. OneAPM大讲堂 | 提高JavaScript性能的30个技巧

    文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 您是网站管理员还是网页开发人员?想创建超快速的网站吗? 今天我们来看看 JavaScript,这项神奇而又复杂的技术.它使网站内容 ...

  6. apache-2.4.x 编译安装方法

    apache-2.2与新出的apache-2.4安装不同的地方在于,2.4版的已经不自带apr库,所以在安装apache-2.4之前,需要下载apr. 1.下载软件 cd /tmp wget http ...

  7. 年终盘点:2021年AI领域值得关注的十件事

    来源:科技日报 几年前提到人工智能,人们的第一反应是全球流行.网络热门.预见未来,但如今,人工智能早已褪去神秘色彩,语音识别.图像识别.智能阅片.病毒测序.药物设计--皆已成为唾手可得的应用. 尤其值 ...

  8. 多线程编程指南 part 2

    多线程编程指南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA95054 U.S.A. 文件号码819–7051–10 2006 ...

  9. 对视觉任务更友好的Transformer,北航团队开源Visformer!

    关注公众号,发现CV技术之美 ▊ 写在前面 目前,将基于视觉任务的Transformer结构正在快速发展.虽然一些研究人员已经证明了基于Transformer的模型具有良好的数据拟合能力,但仍有越来越 ...

最新文章

  1. 杨超越的声音+高晓松的脸~如此酸爽的技术,你值得拥有!
  2. PowerCLI脚本,利用哈希表对参数进行转换
  3. C# 获取字符串长度 获取字符串字节长度
  4. 476. 数字的补数 【位运算】
  5. USTC English Club Note20171014
  6. Spring4.3+Webscket 实现聊天、消息推送详解之具体实现(三)
  7. java.util.regex_java.util.regex.PatternSyntaxException:索引附近的...
  8. python做作业没头绪_使用Python做作业
  9. 从零开始学PowerShell(7)编写一个函数体
  10. ssh放行端口_安全组中已经添加规则放行SSH端口的访问之后如何使用f1 RTL
  11. 全幅與APS-C MTF曲線解讀說明
  12. 5.8. tensorflow2实现SVD推荐系统——python实战 (下篇)
  13. 诺基亚N8-00测评
  14. Ubuntu18.04 安装Matlab2021b
  15. 关于win7系统重装完鼠标不能用的解决办法
  16. 华为 21 级程序员月薪曝光:270k 封神!众网友直呼长见识
  17. Vue Router 实现路由控制实战
  18. (入门级web应用)小书签收集站开发日志(一)--项目规划及最基本功能实现
  19. 编译内核出错:/bin/sh: 1: bison: not found scripts/Makefile.lib:196: recipe for target ‘scripts/kconfig/zco
  20. 【Java多线程并发编程】面试知识点总结

热门文章

  1. SQL模糊查询时LIKE怎样跟变量
  2. Thinkpad T460更换固态硬盘
  3. Python3使用Xpath解析网易云音乐歌手页面
  4. 蓝桥杯真题:小朋友崇拜圈
  5. iPad pro 显示器
  6. AVR单片机网址推荐
  7. phpstudy和mysql哪个好_Phpstudy升级到Mysql8
  8. HTML春节贺卡,HTML5+CSS3实现春节贺卡
  9. 写给Android开发的Android简史
  10. 用poi将word表格转excel