基础的状压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. vi编辑

    保存命令 按ESC键 跳到命令模式,然后: :w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :wq 保存文件并退出vi :wq! 强制 ...

  2. HDU 2059 龟兔赛跑(动态规划)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. win7桌面便签。自带的

    新建WIN7下的桌面便签小程序 桌面—>新建 快捷方式-> 输入%windir%\system32\StikyNot.exe

  4. adt导入已经存在于workspace中的项目

    场景: Eclipse中某android项目被delete,但是并未勾选“delete project contents from disk(cannot be undone)”.删除后,下次再想打开 ...

  5. Spark源码分析(一)-Standalone启动过程

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3858065.html 为了更深入的了解spark,现开始对spark源码进行分析,本系列文章以spark ...

  6. 李洪强漫谈iOS开发[C语言-043]-判断较早日期

    李洪强漫谈iOS开发[C语言-043]-判断较早日期

  7. Linux下面如何安装Django

    首先你需要肯定你的机子上装了Python 现在ubuntu已经自带,所以不必操心 当然你可以在你的机子下测试一下,只需在 terminal 下输入 python 如果出现下面的界面就说明你机子已经装了 ...

  8. Java科普之算法剖析

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 从小白晋升,一路走来:从helloworld,到JFrame,再到Android:从城外小子,到内城 ...

  9. QWidget的六个刷新函数(居然有QWidget::erase函数,且并不产生绘制事件)

    Qt paintevent事件   一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintE ...

  10. http://www.ibm.com/developerworks/cn/java/j-lo-junit-src/

    http://www.ibm.com/developerworks/cn/java/j-lo-junit-src/