poj 3254 Corn Fields (状压dp)(棋盘dp)
状压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)的更多相关文章
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- POJ 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- Poj - 3254 Corn Fields (状压DP)(入门)
题目链接:https://vjudge.net/contest/224636#problem/G 转载于:https://blog.csdn.net/harrypoirot/article/detai ...
- POJ 3254 Corn Fields (状压入门)
Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M≤ 12; 1 ≤ N ≤ 12) ...
- poj 3254 Corn Fields 状压dp入门
题目链接 题意 在\(M\times N\)的\(0,1\)格子上放东西,只有标记为\(1\)的格子可以放东西,且相邻的格子不能同时放东西.问有多少种放法. 思路 参考:swallowblank. \ ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- 状压DP POJ 3254 Corn Fields
题目传送门 /* 状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的, 接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:) 详细解释:http://www.tuicool. ...
- poj - 3254 - Corn Fields (状态压缩)
poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...
- POJ 3254 Corn Fields(状压DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13732 Accepted: 7216 Desc ...
随机推荐
- qt4.7.0 交叉编译环境搭建经验总结
一.前期软件准备: 1 .虚拟机fedora9.到fedora官网下载,地址 http://fedoraproject.org/ 版本推荐使用fedora9,在vm内安装,并且不安装vmware ...
- Python编程:从入门到实践 - matplotlib篇 - plot & scatter
matplotlib篇 plot & scatter # filename.py 获取当前文件名方法 import sys # 当前文件名 print(sys.argv[0]) # 去除后缀后 ...
- 公司组织oracle培训的理解
oracle执行机制 1.客户端发送一条sql给oracle服务器,oracle会看这条sql的执行计划是否存在缓存 如果存在则直接运行,如果不存在执行第二步. 2.如果不存在缓存 则会 进行语法检 ...
- codevs——T1044 拦截导弹 || 洛谷——P1020 导弹拦截
http://codevs.cn/problem/1044/ || https://www.luogu.org/problem/show?pid=1020#sub 时间限制: 1 s 空间限制: 1 ...
- HDU 1431
可以先找出回文数,再用素数测试来判是否为素数即可. 打回文数时,因为左右对称,可以只枚举后半部,然后通过逆转得到前半部分. #include <iostream> #include < ...
- 微软ASP.NET网站部署指南(9):部署数据库更新
1. 综述 无论什么时候,程序都有可能像代码更新一样更新数据库.本章节你将进行数据库改动,測试.然后部署到測试环境和生产环境. 提醒:假设依据本章节所做的操作出现错误信息或一些功能不正常的话,请务必 ...
- 本地 配置 Memcache
如果帮到了您,可以支持一下,谢谢您的支持! Windows下的Memcache安装: 64bit:如果需要win64版,下载 memcached-win64-1.4.4-14.zip(直接下),里面有 ...
- BZOJ 4027: [HEOI2015]兔子与樱花 贪心
4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...
- Codeforces Round #338 (Div. 2) B. Longtail Hedgehog 记忆化搜索/树DP
B. Longtail Hedgehog This Christmas Santa gave Masha a magic picture and a pencil. The picture con ...
- Beginning Python From Novice to Professional (9) - Socket
Socket 小型server: #!/usr/bin/env python import socket s = socket.socket() host = socket.gethostname() ...