LG1879 「USACO2006NOV」Corn Fields 状压DP
2024-09-01 01:37:22
问题描述
题解
设\(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;
}
最新文章
- 2、利用蓝牙定位及姿态识别实现一个智能篮球场套件(二)——CC2540/CC2541基于广播的RSSI获得
- 查看 SHA1
- SOAP-XML请求(iOS应用下集成携程api)
- js常用函数、书写可读性的js、js变量声明...
- 为什么要使用 Node.js
- [代码] 类似 YYText 将表情文本转换成表情字符
- jquery发送ajax请求返回数据格式
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
- cppunit学习笔记
- iOS 事件处理机制与图像渲染过程
- VS2005--设置Release模式下调试
- 开源框架GreenDao的操作
- 快递鸟顺丰物流api接口对接多种方法整理
- Java 集合详解
- vue-router路由讲解
- 20164319 刘蕴哲 Exp5 MSF基础应用
- ubuntu中vim下按上下左右键时输入A、B、C、D
- python之二分法查找
- Django框架----中间件
- [转]截图软件分享 - Snipaste
热门文章
- ServerSocket类的常用方法
- echarts 部分美化配置项使用记录
- 向QGIS项目组提交了一份建议
- netty解决粘包半包问题
- 每日JAVA面试
- python——map()函数
- mysql 读写分离(手动和自动方法)
- IDEA 护眼色设置
- django.db.utils.OperationalError: (1093, ";You can&#39;t specify target table &#39;xxx&#39; for update in FROM clause";)
- (三十六)c#Winform自定义控件-步骤控件-HZHControls