首先,这题根本就没有什么所谓的状压dp,而且只有一个地方用到了状态压缩,即第一行按开关的方式
本题主要的考察内容其实就是位运算,暴力以及一些递推思想
1.高票题解代码中的 if (k >> j & 1) 究竟什么意思?
其中,k保存的根本就不是第一行的灯所有可能的状态,不然它第j位都为1了还按它干嘛? k单纯只是保存了第一行按开关的32种方式,与输入数据无关。
且大多数题解代码中都规定了k在二进制下某位为1就代表我们选择按下这一位所在编号的开关,你也可以自己规定k在二进制下某位为0才代表我们选择按下这一位所在编号的开关,这都无所谓。
比如k在二进制下表示为10001,就代表我们选择按第一行编号为0和编号为4的开关,然后对输入数据中第一行这两位执行turn操作。
2.递推思想
当前行若某一位(i,j)为0,那就用其所在列的下一行(i+1,j)去执行turn操作,以使(i,j)变为1,即变亮。
如果对(i,j)执行turn操作,使(i,j)变为1,就会破坏上一行的灯的状态。
所以只能从下一行去改变上一行的灯的状态。
真好!
补充为什么要枚举第一行的所有情况:
1,第一行确定余下四行的开灯结果是固定的是必然的发生的
2,第一行的五个开关也是可以按动的,不同的按动会有不同的结果共有2的5次方种结果
(看不懂我说的话没关系可以先看看别人的题解然后再回来品一品想一想)
进来这里懂了,我说为什么要1还要按,其实是为了存储32种按的方式,跟1,与0没有关系,只是0到32的二进制中1的位置对应的是第一行按开关的位置,共32种,在这32种里面找
#TQL
二进制枚举就是用来表示第一行的所有开关状态。仅仅表示他是按还是不按不用
考虑这个灯是否是亮着的。输入已经给了第一行的状态我们所能做的就是考虑这个
开关要不要开一共有32种情况全部枚举。二进制只表示要不要开与灯是不是亮着无关的。
刚好重点解释了有疑惑的地方,赞
### 太厉害了
豁然开朗牛逼,我也在奇怪我为啥本来都是1,为啥还要按
我好像理解了
这里的k是二进制数 对应的是32个按的状态(不是按K)是k的操作影响了第一行的状态 (也是就是说第一行是亮的也有可能被按灭)
k二进制是1的位置 通过turn操作 其实改变了g第一行的操作
所以这里其实是对第一行进行2^5次方种操作 从而达到每一种按法
还是不知道if (k >> j & 1) 是什么意思
k的二进制数右移j位然后和1做与操作,大白话就是看一下k的二进制数的第j位是1还是0。我的理解是第一行的所有32种可能性都要枚举一遍,其中就包含了初始状态,然后选操作数最小的一个
%%%
%%%
原来如此
没写代码都能高赞不是没有原因的orzorz
very good
一针见血的
懂了!!!!!太感谢了!!!!!
谢谢,恍然大悟
强的捏orz
谢谢你^_^