状压dp入门题

因为当前行的状态只和上一行有关

所以可以一行一行来做

因为m <= 12所以可以用二进制来表示放了或者没有放

0表示没放,1表示放

f[i][state]表示第i行状态为state的方案数

f[i][state] = sum(f[i-1][state'])

枚举行,然后枚举这一行和上一行的状态

最后把最后一行所有状态的和加起来就行了

状态是这么定义,但是实际操作略有不同

因为state的状态有很多被剔除,所以我们可以只存

state数组的下标来省空间

也就是说f[i][j]表示第i行状态为state[j]的方案数

这一点貌似其他博客都没有提到。

还有几个点要注意

(1)怎么表示左右没有相邻?

这里有个骚操作 x & (x << 1)

如果这个值为真,就表示有1相邻。

这是显而易见的,不懂得拿笔画一下就知道了

可以一开始就把不可行的状态剔除,非常省时间

(2)怎么表示上下没有相邻

两行的状态取&,值为真就有相邻

(3)题目给的限制条件怎么用

题目中说0就是不可以放

那么如果是0就设为1,然后和当前状态取&

如果值为真就说明有重合,就不行

(4)最后,一个小细节

我一开始是写如果到第n - 1行(我从0开始),就更新答案。

然后是WA。

如果是单独写一个循环来更新,就AC

想了想,发现如果只有一行的话,第一种写法答案是不会被更新的。

因为如果只有一行循环根本不会进行!!!

我第一次遇到这样的坑,以后要注意

#include<cstdio>
#include<vector>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 20;
const int MAXM = 600;
const int MOD = 1e8;
int f[MAXN][MAXM], map[MAXN], n, m;
vector<int> state; inline bool judge(int x) { return !(x & (x << 1)); }
inline bool fit(int x, int i) { return !(x & map[i]); } void init()
{
REP(i, 0, 1 << m)
if(judge(i))
state.push_back(i);
} int main()
{
while(~scanf("%d%d", &n, &m))
{
memset(f, 0, sizeof(f));
state.clear(); init(); REP(i, 0, n)
{
map[i] = 0;
REP(j, 0, m)
{
int x; scanf("%d", &x);
if(x == 0) map[i] |= (1 << (m - j - 1));
}
} REP(i, 0, state.size())
if(fit(state[i], 0))
f[0][i] = 1; int ans = 0;
REP(i, 1, n)
REP(j, 0, state.size())
{
if(!fit(state[j], i)) continue;
REP(k, 0, state.size())
{
if(!fit(state[k], i-1)) continue;
if(state[j] & state[k]) continue;
f[i][j] = (f[i][j] + f[i-1][k]) % MOD;
}
}
_for(i, 0, state.size()) ans = (ans + f[n-1][i]) % MOD;
printf("%d\n", ans);
} return 0;
}

poj 3254 Corn Fields (状压dp)(棋盘dp)的更多相关文章

  1. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

  2. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

  3. [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp

    题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...

  4. Poj - 3254 Corn Fields (状压DP)(入门)

    题目链接:https://vjudge.net/contest/224636#problem/G 转载于:https://blog.csdn.net/harrypoirot/article/detai ...

  5. POJ 3254 Corn Fields (状压入门)

    Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M≤ 12; 1 ≤ N ≤ 12) ...

  6. poj 3254 Corn Fields 状压dp入门

    题目链接 题意 在\(M\times N\)的\(0,1\)格子上放东西,只有标记为\(1\)的格子可以放东西,且相邻的格子不能同时放东西.问有多少种放法. 思路 参考:swallowblank. \ ...

  7. POJ 1684 Corn Fields(状压dp)

    描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...

  8. 状压DP POJ 3254 Corn Fields

    题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...

  9. poj - 3254 - Corn Fields (状态压缩)

    poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...

  10. POJ 3254 Corn Fields(状压DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13732   Accepted: 7216 Desc ...

随机推荐

  1. 【AIM Tech Round 5 (rated, Div. 1 + Div. 2) 总结】【题解往前或往后翻,不在这】

    又是爆炸的一场 心态有点小崩.但问题不大.. 看A题,一直担心有多个正方形..小心翼翼地看完之后,毅然地交上去了. [00:08] A[Accpted] 然后开始看B题. 觉得和之前做的某题很像,但翻 ...

  2. 【codeforces 807A】Is it rated?

    [题目链接]:http://codeforces.com/contest/807/problem/A [题意] 给你n个人在一场CF前后的rating值; 问你这场比赛是不是计分的 [题解] 如果有一 ...

  3. 关于sql连接查询(内联、左联、右联、全联)

    内连接(INNER JOIN)(典型的连接运算,使用像   =   或   <>   之类的比较运算符).包括相等连接和自然连接. 内连接使用比较运算符根据每个表共有的列的值匹配两个表中的 ...

  4. [Design]Adobe CS6 2%错误问题

    错误描述:FATAL: Payload '{3F023875-4A52-4605-9DB6-A88D4A813E8D} Camera Profiles Installer 6.0.98.0' info ...

  5. Python Study (05)装饰器

    装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一 ...

  6. 【我所认知的BIOS】—&gt; uEFI AHCI Driver(6) AtaAtapiPassThruSupported的局部变量们

    [我所认知的BIOS]-> uEFI AHCI Driver(6) - AtaAtapiPassThruSupported的局部变量们 LightSeed 5/7/2014 前面5个篇文章把EF ...

  7. UML基本架构建模--获取类

     Getting Started 開始 Modeling a system involves identifying the things that are important to your p ...

  8. 【Swift】学习笔记(六)——函数

    函数  懂编程语言的来说这个是最主要的了,不论什么语言都有函数这个概念.函数就是完毕特定任务的独立代码块. 函数怎么创建: 1.创建一个无參无返回值的函数(实际上全部的函数都有返回值,这个函数返回vo ...

  9. VM网络连接设置具体解释

    參考http://zhidao.baidu.com/link? url=NU8UcLsp6CCgRZzeMgnb7v0p7Z78eLYloYW355Z9fQa__pm_lFBtpfSs61ZR2Wq2 ...

  10. EMC存储划分lun过程

    下图是EMC存储系统示意图: 若将lun打散重建,需按以下步骤进行: 1. 在Storage Groups上点右键选择Select Luns,在打开的窗口中,将右边Selected Lun项下的lun ...