基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算。

我们可以先把输入中每行的01压缩成一个整数。

判断一个状态是否有相邻1:

如果 x & (x << 1) 非0,说明有相邻的两个1

判断一个状态能否放在该行:

如果 (a[i] & state) != state,说明是不能放置的。因为a[i]中存在某个0和对应state中的1,与运算之后改变了state的值

判断相邻两行的状态是否有同一列相邻的1:

如果(state & _state)不为零,说明有相邻的1

 #include <cstdio>
#include <cstring> const int maxn = ;
const int M = ;
int a[maxn], d[maxn][ << maxn];
int n, m, tot; inline bool check_row(int x) { return x & (x << ) ? false : true; } //判断一行是否有相邻的
inline bool check_col(int x1, int x2) { return x1 & x2 ? false : true; } //判断一列是否有相邻的
inline bool check_put(int a, int x) { return (x & a) == x ? true : false; } //判断该状态能否放在该行 int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%d%d", &n, &m) == )
{
memset(d, , sizeof(d));
for(int i = ; i < n; i++)
{
int t;
a[i] = ;
for(int j = ; j < m; j++) { scanf("%d", &t); a[i] = a[i] * + t; }
}
tot = ( << m);
for(int i = ; i < tot; i++) if(check_row(i) && check_put(a[], i)) d[][i] = ; for(int i = ; i < n; i++)
{//枚举行标
for(int state = ; state < tot; state++)
{//枚举该行的状态
if(!check_row(state) || !check_put(a[i], state)) continue;
for(int _state = ; _state < tot; _state++)
{//枚举上一行的状态
if(state & _state) continue;
d[i][state] = (d[i][state] + d[i-][_state]) % M;
}
}
} int ans = ;
for(int i = ; i < tot; i++) ans = (ans + d[n-][i]) % M;
printf("%d\n", ans);
} return ;
}

代码君

POJ 3254 (状压DP) Corn Fields的更多相关文章

  1. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

  2. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  3. POJ 3254 状压DP

    题目大意: 一个农民有一片n行m列 的农场   n和m 范围[1,12]  对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...

  4. POJ 3254 状压DP(基础题)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17749   Accepted: 9342 Desc ...

  5. Corn Fields(POJ 3254状压dp)

    题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...

  6. poj 1170状压dp

    题目链接:https://vjudge.net/problem/POJ-1170 题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价.接下 ...

  7. POJ 2411 状压DP经典

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16771   Accepted: 968 ...

  8. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  9. POJ 2441 状压DP

    Arrange the Bulls Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 5289   Accepted: 2033 ...

随机推荐

  1. HTML5 Cheat sheet PNG帮助手册(标签、事件、兼容)

    HTML5 Cheat sheet PNG帮助手册(标签.事件.兼容) 1.HTML5标签 2.HTML5事件 3.HTML5兼容 最新HTML5手册资料请参考:http://www.inmotion ...

  2. 定时器 corn 表达式

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素.按顺序依次为1.秒(0~59)2.分钟(0~59)3.小时(0~23)4.天(月)(0~31,但是你需要考虑你月的天数)5.月(0~11 ...

  3. POJ 1538

    #include <iostream> #include <iomanip> using namespace std; ]; //拉格朗日插值算法 int main() { / ...

  4. hdu 4061 A Card Game

    思路: 分析:假设取的牌顺序是一个序列,那么这种序列在末尾为1时是和取牌序列一一对应的,且是符合“游戏结束时牌恰好被取完”的一种情况. 简证:1.在序列中,任一数 i 的后一个数 j 是必然要放在第 ...

  5. 传说中的WCF(3):多个协定

    我们知道,WCF服务端是先定义服务协定,其实就是一个接口,然后通过实现接口来定义服务类.那么,有一个问题,如果一个服务类同时实现N个接口(也就是有N个协定)呢?结果会如何? 不必猜,我们还是通过实验来 ...

  6. CSS深入理解之line-height

    以下文字整理自慕课网——张鑫旭的<CSS深入理解之line-height>. line-height,又称行高,指的是两行文字基线之间的距离,又可以称为这行文字所占的高度. 定义三问: 什 ...

  7. linux ps命令详解

    ps工具标识进程的5种状态码: D 不可中断 uninterruptible sleep (usually IO) R 运行 runnable (on run queue) S 中断 sleeping ...

  8. centOS学习part1:操作系统安装

    0 linux作为服务器的主要操作系统,在处理速度以及安全性上都要优于windows,虽然需要很多命令要记,但是一般常用的命令不多,用多了就熟悉了,而且现在很多都要图形界面,也降低了学习成本. cen ...

  9. 李洪强iOS开发之断点续传1

    未完待续.. // //  ViewController.m //  A18 - duo wen jian shang chuan // //  Created by 李洪强 on 16/6/29. ...

  10. 李洪强iOS开发之OC[009] -OC无参方法的声明实现和调用