状压DP POJ 3254 Corn Fields
/*
状态压缩DP:先处理硬性条件即不能种植的,然后处理左右不相邻的,
接着就是相邻两行查询所有可行的种数并累加 写错一个地方差错N久:)
详细解释:http://www.tuicool.com/articles/JVzMVj
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int MAXN = ;
const int INF = 0x3f3f3f3f;
const int MOD = 1e8;
int dp[MAXN][ << MAXN];
int st[ << MAXN];
int rem[ << MAXN]; int solve(int m)
{
int cnt = ;
int tot = << m;
for (int i=; i<tot; ++i)
{
if ((i & (i << )) == )
{
st[++cnt] = i;
}
} return cnt;
} void work(int n, int m, int cnt)
{
memset (dp, , sizeof (dp));
for (int i=; i<=cnt; ++i)
{
if ((st[i] & rem[]) == )
{
dp[][i] = ;
}
} for (int i=; i<=n; ++i)
{
for (int k=; k<=cnt; ++k)
{
if ((st[k] & rem[i]) == )
{
for (int j=; j<=cnt; ++j)
{
if (((st[j] & rem[i-]) == ) && ((st[j] & st[k]) == ))
dp[i][k] = (dp[i][k] + dp[i-][j]) % MOD;
}
}
}
} int ans = ;
for (int i=; i<=cnt; ++i)
{
ans = (ans + dp[n][i]) % MOD;
} printf ("%d\n", ans);
} int main(void) //POJ 3254 Corn Fields
{
#ifndef ONLINE_JUDGE
freopen ("F.in", "r", stdin);
#endif int n, m;
while (~scanf ("%d%d", &n, &m))
{
int cnt = solve (m); memset (rem, , sizeof (rem));
for (int i=; i<=n; ++i)
{
int x;
for (int j=; j<=m; ++j) //看错n和m
{
scanf ("%d", &x);
if (x == )
{
rem[i] = rem[i] | ( << (m-j));
}
}
} work (n, m, cnt);
} return ;
}
状压DP POJ 3254 Corn Fields的更多相关文章
- 状压 DP:[USACO06NOV] Corn Fields,[USACO13NOV] No Change
[USACO06NOV] Corn Fields (试题来源:Link ) 题目描述 Farmer John has purchased a lush new rectangular pasture ...
- 【状压DP】poj3254 Corn Fields
题意: 一块n*m的田,1表示这个地方可以种植,0代表这个地方不能种植.植物种植还必须满足两株植物不能相邻(横竖都不行).问共有几种种植方法,而且当什么都不种时认为是一种方法. 解题思路: 种植用1表 ...
- poj - 3254 - Corn Fields (状态压缩)
poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...
- 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入门题,将可以种菜的状态用一个数的二进制表 ...
- 动态规划晋级——POJ 3254 Corn Fields【状压DP】
转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- POJ - 3254 Corn Fields(状压DP)题解
思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...
- POJ 3254 Corn Fields (状压DP,轮廓线DP)
题意: 有一个n*m的矩阵(0<n,m<=12),有部分的格子可种草,有部分不可种,问有多少种不同的种草方案(完全不种也可以算1种,对答案取模后输出)? 思路: 明显的状压DP啦,只是怎样 ...
随机推荐
- 关闭火车头dedecms发布模块自动关键词,解决火车头发布dedecms文章关键词过多问题
用火车头发布dedecms文章时,经常会自动添加关键词,这些关键词默认有10个,数量过多,而且是随机提取的,乱七八糟的词都进去了,如下图所示: 这些关键词可能会成为se判断你作弊的依据,现在se也弱化 ...
- cocos代码研究(1)sprite学习笔记
各种方法创建Sprite和Animate //图片创建法 参数一:图片资源路径 参数二:Rect选区 auto sprite = Sprite::create(, )); addChild(sprit ...
- js实现table排序-sortable.js
方案一.引用sortable.js包 /* <th class="thcss" style="width: 40px;" onclick="so ...
- 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)
从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...
- hiho #1272 买零食 [Offer收割]编程练习赛2
#1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...
- linux 如何清理僵尸进程
今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ? S 0:05 \_ /usr/bin/python /usr/bin/nova- ...
- JAVA 中BIO,NIO,AIO的理解
[转自]http://qindongliang.iteye.com/blog/2018539 ?????????????????????在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解 ...
- hdu2089
基本的数位dp #include <cstdio> #include <cstring> using namespace std; #define D(x) x ; int n ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- PHP--TP框架----操作数据库
//操作数据库 //$attr = $m->select(); //查询所有数据 //$attr = $m->s ...