位运算

筅森魡賤 提交于 2019-11-27 11:52:42

范围n-----$100000$   m $30$

输出方案

这是一个很好的$dp$题

首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$,那么你可以达到任何`一种$n$个$1$的情况

例如

你最后可以达到$3$个$1$

那么你可以达到$11100 $  $ 01110$    $01011$    $01101$等方案

证明:题目里说的操作和优美值都是一的个数相关,只要我们可以达到$n$个一,我们可以通过变换$1$的位置得到多种方案

于是题目里给的$C$我们并不关心,我们只关心$1$的个数,我们把1都放到最右面,另外这也给我们下面dp提供方便

我们先看各个运算意义

假设你$x$和$y$中有$s$个重复的$1$求各个运算之后一的个数,

$\&$后$1$的个数就是$s$,

对于$|$我们如果都加的话重复的多加一次

$|$后$1$的个数就是$x+y-s$

重复变为0

^后$1$的个数就是$x+y-s-s$

然后我们可以尝试列一个$dp$

设$f[x][j]$表示第$x$个操作有$j$个$1$的情况,我们当有这种情况就设为$1$,设最后$C$中一的个数为$x$,我们只需要看$f[n][x]$,若$f[n][x]$为$1$递归找解(后面会说到,其实递归找解是这个题最难的地方),若为$0$就是无解

根据上面得出结论我们可以列出

枚举这次操作后重复个数为w,设这次优美值为$G[i]$,枚举之前1的个数为$j$

若这次操作为$&$则$f[x][w]=max(f[x-1][j],f[x][w])$

若为$|$ 则$f[x][G[i]+j-w]=max(f[x][G[i]+j-w],f[x-1][j])$

类似的若为^则$f[x][G[i]+j-w*2]=max(f[x][G[i]+j-w*2],f[x-1][j])$

然后

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!