状压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. MySQL多线程数据导入导出工具Mydumper

    http://afei2.sinaapp.com/?p=456 今天在线上使用mysqldump将数据表从一个库导入到另外一个库,结果速度特别慢,印象中有个多线程的数据导入导出工具Mydumper,于 ...

  2. Memcache Redis 与Mogodb优缺点

    MemcachedMemcached的优点: Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约 ...

  3. Android 开源项目android-open-project解析之(二) GridView,ImageView,ProgressBar,TextView

    五.GridView StaggeredGridView 同意非对齐行的GridView,类似Pinterest的瀑布流.而且跟ListView一样自带View缓存,继承自ViewGroup 项目地址 ...

  4. CC2540 与 CC2541 差别 1

    CC2540 的 1234 PIN 是 USB 功能,4 PIN 是 USB 的电压输入引脚. CC2541 没有 USB 功能.它的 1234 PIN 是 I2C 功能,为了与 CC2540 引脚兼 ...

  5. CCDirector导演类

    CCDirector类是Cocos2D-x游戏引擎的核心.它用来创建而且控制着屏幕的显示,同一时候控制场景的显示时间和显示方式. 在整个游戏里一般仅仅有一个导演.游戏的開始.结束.暂停都会调用CCDi ...

  6. 在SAE上使用Ueditor的图片上传功能

    SAE上是没有文件夹读写权限的,所以要在SAE使用Ueditor的图片上传功能须要借助SAE的Storage服务. 一.开通Storage服务 在SAE控制台开通Storage服务,并新增一个doma ...

  7. C# 监控Windows睡眠与恢复

    SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; private void SystemEvents_PowerModeC ...

  8. Directx Matrix.PerspectiveFovLH Matrix.PerspectiveFovRH的理解

    该函数一个四个参数public static Matrix PerspectiveFovLH ( float fieldOfViewY, float aspectRatio, float znearP ...

  9. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

  10. CXF2.7.7 java.lang.RuntimeException: Cannot create a secure XMLInputFactory

    cxf-2.7.7.jar neethi-3.0.2.jar stax2-api-3.1.1.jar woodstox-core-asl-4.2.0.jar wsdl4j-1.6.3.jar xmls ...