牛客练习赛18E pocky游戏 状压dp

时间:2023-03-08 22:37:12

正解:状压dp+辅助dp

解题报告:

来还债辣!NOIp之后还是轻松很多了呢,可以一点点儿落实之前欠下的各种东西一点点提升自己!加油鸭!

是个好题,可以积累套路,启发性强,而且很难

哦而且状压它也是个好东西鸭,这次D2T2好像8以内的部分分就是用神仙状压做的呢,当然我是不会的只会傻逼地推数论QAQ还是可以落实学习一下那题的神仙状压部分分呢QAQ

ummm那这题因为最开始是没太懂的 所以和之前做疫情控制一样分几个板块慢慢梳理趴qwq

首先要确定这题用什么方法?

不要说是已经看到题解说用状压dp辣!

正儿八经说,如果没有题解,怎么思考这道题

关键点大概是在n<=20这个事儿,看到20应该就要敏感了,这个就很,状压dp是趴

好滴积累套路一:20这个范围很有可能是状压dp可以往上面想下

然后确定方法之后就一步步思考,先把题目描述给一点点扣了

首先碰到第一坑点:绝对值

这一个又是一个,典型套路!就是,如果我们按部就班地一点点考虑,我们完全没有办法搞绝对值这个小妖精

但是如果它不是绝对值,就单纯的+-还是有点可做性的感觉的?那我们就可以考虑去除绝对值

想到去除绝对值大概就会有点感觉了——按照大小顺序确定!不就可以直接解决绝对值了嘛!

好滴那套路二来啦:如果碰到绝对值的问题可以考虑从小到大or从大到小考虑然后就可以直接把绝对值删了

那我们现在就相当于是,从小到大考虑每个数在pi中的位置,然后再一点点做

恩然后按照状压dp的套路我们就可以得到肯定是设fi表示状态i的minans咯,考虑怎么转移

先考虑每确定pi中的一个数会有什么贡献

显然对于长度为m的那个序列中的每个数它只会对它左右的数造成贡献

然后我们可以预处理出来贡献的

大概说下预处理贡献趴毕竟你太蠢估计再看一遍又要理解半天呢QAQ

大概就是,我们读入一个数处理完它之后就存给last,然后读入它的下一个数now,这样我们计算贡献就++glast2now ++gnow2last   (关于g的意义可能在这里还是会感觉比较难懂?可以往下翻呢后面又讲述了遍qwq

这样全部读完的时候我们就已经预处理出gij表示只确定了pj位然后这时候我们确定pi位的时候pi的系数是多少

但这当然不够我们肯定是要各种确定状况下确定pi位的贡献是趴,然后就读完之后再再再处理下嘛,就和dp差不多的转一下,就枚举状态j然后gij=gij-lowbitj+gilowbitj转移来就好辣,这样就能预处理出任意一个状态i时确定第j个数的系数是多少

昂预处理贡献港完就差不多把描述扣完辣,总算可以进入正式dp转移了 转移完就做完辣!激不激动!

总算进入正题的dp

就大力转移啊,枚举处理到p数列的i这个状态了然后一一枚举新加入的最大的数放在这个状态中确定了的位置j上

然后就转移是fi可以从(f没有确定j+确定j的贡献)转移来,当然也可以不转,就是如果把最大的数放在另一个位置上,我们发现,欸,更好,那我们就不用放这儿了嘛又不是傻逼

然后最后一个难点!确定j的贡献怎么计算

你意思意思理解下得了x

就是首先我们要知道新加入的这个最大的数它是第几大的,这个很好求吼,我们先当做我们知道了,它是第cjk大的然后它的值是data[cjk](。。。懒得想变量名了凑合着用就这样趴qwq)然后那就是我们预处理出的gji-gj2n-i)*(data[cjk]

关于g再解释下趴还是比较难理解的呢QAQ

就是我们现在相当于是说搞出状态j时插入i的系数,这个就是它的正系数,它在这里面都是被减数,相当于是加的

然后后面那个表示我现在已经确定了状态i,那它的补集就是2n-i对趴,这个补集就是还没有确定的数,这些数就都是比data[cjk]大的了,那就所有在data[cjk]旁边的数都会-它,它就成了减数了

我们就把它作为被减数时的系数-它作为减数时的系数就是它的实际系数了然后乘以它的data就是它的贡献了呢

明白了嘛!

哇我真滴觉得!!!太太太妙了!怎么这么妙呢!

over!

(还是忍不住再说句,真滴好妙啊!!!天呐!!!