如果上一行的状态是now,下一行的状态是prev,那么我们只需要确保上下两行的选择方案里没有重复的元素,也就
是(now &prev)==0就可以了。
此外,我们还需要判断当前行的状态是否合法,因为读入的矩阵中并不是每个格子都可以选择的,如果我们将矩阵中每行的
值也用状态压缩来存储,不妨记为flag,那么当前行选择的格子集合一定包含于当前行合法格子的集合,也就是
说,(now | flag)==flag必须成立;同时行内也不能选择相邻的,也就是now &(now >>1)=0必须成立。
这样,我们就可以通过枚举上一行的所有状态,来更新当前行、当前状态的最优解了。直到算完最后一行,统计一下所有状
态的最大值即可。
比如说上述的代码
按照上图之中的按位运算对其进行操作转化可得。