【NOIP】【部分题解】

NOIP2021数列

Analysis

先注意题目的关键点:

  1. 要满足S=2a1+2a2++2an 的二进制表示中 1 的个数不超过 k
  2. 一个合法数列的权值是一个 va1×va2××van的乘积形式

容易发现,限置和权值的计算都与位置无关,那么可以想到,先计算所有a序列单调不降的所有权值和再乘上个多重集排列数。
那么一个维度表示当前选的最高位是多少,一个维度表示目前选了几个数。我们还要在dp时满足S的限制,但是S的范围太大,不能直接表示。出题人不可能随便给个限制啊,这个限制一定是有一些性质的。

实际上,你会发现n的范围很小,所以S最多比当前选的最大的数的2的次幂要多4位,而且dp时按照从小到大递推,当前最大的数在二进制中对应的位置一旦确定,以后都不会改变,因此只需再用一个O(n)的维度表示前面确定的不会改变的1的个数,和2^4大小的维度表示剩下的S即可。

转移时用刷表法应该更方便,注意要边递推,边把多重集的排列数的贡献算上(一开始以为算不了,想别的方法想了好久。。。)
提交记录
补充:关于这题的dp,其实可以归为一类模型:
要给一个序列每个位置填上一个值,而且每个位置的限制相同,贡献也相同,那么可以考虑从小到大往里填值,如果允许某个数只选0个的话,那么就可以省去枚举上一大小的数是多少,转移时乘上二项式系数和累计的贡献

posted @   glq_C  阅读(46)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示