C++状态压缩解决不相邻问题

如果上一行的状态是now,下一行的状态是prev,那么我们只需要确保上下两行的选择方案里没有重复的元素,也就

是(now &prev)==0就可以了。

此外,我们还需要判断当前行的状态是否合法,因为读入的矩阵中并不是每个格子都可以选择的,如果我们将矩阵中每行的

值也用状态压缩来存储,不妨记为flag,那么当前行选择的格子集合一定包含于当前行合法格子的集合,也就是

说,(now | flag)==flag必须成立;同时行内也不能选择相邻的,也就是now &(now >>1)=0必须成立。

这样,我们就可以通过枚举上一行的所有状态,来更新当前行、当前状态的最优解了。直到算完最后一行,统计一下所有状

态的最大值即可。

27b29a6117de4301b55a517e3ce98f19.jpg

 比如说上述的代码

a9bba8fa96da4570ac92f5c7e890fc7d.jpg

 按照上图之中的按位运算对其进行操作转化可得。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值