【17 提高 1】 给
【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】 给相关推荐
- 2018.8.17提高B组模拟考试
今天,是一个重要的日子. (想什么呢?我说的当然是那位大人的生日啦) T1 题意简述:jzoj3223 Description Input Output 输出 q行,第 i行输出对于第 i个询问的答案 ...
- jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】
正题 题目大意 n∗nn*nn∗n的矩形,每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上.如果没有就失败了,求必胜方. 解题思路 如果场地上有一个位置堵上后即可堵上所有 ...
- jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】
正题 题目大意 开始暴击率为xxx,每次失败后都会增加xxx,成功后重置,然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ans ...
- 【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 ...
- OneAPM大讲堂 | 提高JavaScript性能的30个技巧
文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 您是网站管理员还是网页开发人员?想创建超快速的网站吗? 今天我们来看看 JavaScript,这项神奇而又复杂的技术.它使网站内容 ...
- apache-2.4.x 编译安装方法
apache-2.2与新出的apache-2.4安装不同的地方在于,2.4版的已经不自带apr库,所以在安装apache-2.4之前,需要下载apr. 1.下载软件 cd /tmp wget http ...
- 年终盘点:2021年AI领域值得关注的十件事
来源:科技日报 几年前提到人工智能,人们的第一反应是全球流行.网络热门.预见未来,但如今,人工智能早已褪去神秘色彩,语音识别.图像识别.智能阅片.病毒测序.药物设计--皆已成为唾手可得的应用. 尤其值 ...
- 多线程编程指南 part 2
多线程编程指南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA95054 U.S.A. 文件号码819–7051–10 2006 ...
- 对视觉任务更友好的Transformer,北航团队开源Visformer!
关注公众号,发现CV技术之美 ▊ 写在前面 目前,将基于视觉任务的Transformer结构正在快速发展.虽然一些研究人员已经证明了基于Transformer的模型具有良好的数据拟合能力,但仍有越来越 ...
最新文章
- 杨超越的声音+高晓松的脸~如此酸爽的技术,你值得拥有!
- PowerCLI脚本,利用哈希表对参数进行转换
- C# 获取字符串长度 获取字符串字节长度
- 476. 数字的补数 【位运算】
- USTC English Club Note20171014
- Spring4.3+Webscket 实现聊天、消息推送详解之具体实现(三)
- java.util.regex_java.util.regex.PatternSyntaxException:索引附近的...
- python做作业没头绪_使用Python做作业
- 从零开始学PowerShell(7)编写一个函数体
- ssh放行端口_安全组中已经添加规则放行SSH端口的访问之后如何使用f1 RTL
- 全幅與APS-C MTF曲線解讀說明
- 5.8. tensorflow2实现SVD推荐系统——python实战 (下篇)
- 诺基亚N8-00测评
- Ubuntu18.04 安装Matlab2021b
- 关于win7系统重装完鼠标不能用的解决办法
- 华为 21 级程序员月薪曝光:270k 封神!众网友直呼长见识
- Vue Router 实现路由控制实战
- (入门级web应用)小书签收集站开发日志(一)--项目规划及最基本功能实现
- 编译内核出错:/bin/sh: 1: bison: not found scripts/Makefile.lib:196: recipe for target ‘scripts/kconfig/zco
- 【Java多线程并发编程】面试知识点总结