问题描述

LG1879


题解

设\(opt[i][j]\)代表前\(i\)行,且第\(i\)行状态为\(j\)的方案数。

枚举\(j\),再枚举\(k\),\(k\)为上一行的状态。

判断\(j,k\)能否共存(j&k==0

计数转移即可。

必须加强位运算能力。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
} const int mod=100000000; int ans,n,m;
int a[14]; int opt[14][(1<<12)];
bool exist[(1<<12)];
int main(){
read(n);read(m);
for(int i=1;i<=n;i++){
for(int j=1,x;j<=m;j++){
read(x);a[i]=(a[i]<<1)+x;
}
}
for(int i=0;i<(1<<m);i++){
if(((i&(i<<1))==0)&&((i&(i>>1))==0)) exist[i]=1;
}
opt[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<(1<<m);j++){
if(!exist[j]) continue;
if((j&a[i])!=j) continue;
for(int k=0;k<(1<<m);k++){
if((j&k)==0) opt[i][j]=(opt[i][j]+opt[i-1][k])%mod;
}
}
}
for(int i=0;i<(1<<m);i++){
ans=(ans+opt[n][i])%mod;
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. 2、利用蓝牙定位及姿态识别实现一个智能篮球场套件(二)——CC2540/CC2541基于广播的RSSI获得
  2. 查看 SHA1
  3. SOAP-XML请求(iOS应用下集成携程api)
  4. js常用函数、书写可读性的js、js变量声明...
  5. 为什么要使用 Node.js
  6. [代码] 类似 YYText 将表情文本转换成表情字符
  7. jquery发送ajax请求返回数据格式
  8. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
  9. cppunit学习笔记
  10. iOS 事件处理机制与图像渲染过程
  11. VS2005--设置Release模式下调试
  12. 开源框架GreenDao的操作
  13. 快递鸟顺丰物流api接口对接多种方法整理
  14. Java 集合详解
  15. vue-router路由讲解
  16. 20164319 刘蕴哲 Exp5 MSF基础应用
  17. ubuntu中vim下按上下左右键时输入A、B、C、D
  18. python之二分法查找
  19. Django框架----中间件
  20. [转]截图软件分享 - Snipaste

热门文章

  1. ServerSocket类的常用方法
  2. echarts 部分美化配置项使用记录
  3. 向QGIS项目组提交了一份建议
  4. netty解决粘包半包问题
  5. 每日JAVA面试
  6. python——map()函数
  7. mysql 读写分离(手动和自动方法)
  8. IDEA 护眼色设置
  9. django.db.utils.OperationalError: (1093, &quot;You can&#39;t specify target table &#39;xxx&#39; for update in FROM clause&quot;)
  10. (三十六)c#Winform自定义控件-步骤控件-HZHControls