一道状压\(DP\)

POJ原题链接

洛谷原题链接

很显然的状压,\(1\)表示种植,\(0\)表示荒废。

将输入直接进行状压,而要满足分配的草场是适合种草的土地,即是分配时的状态中的\(1\),在输入对应的状态中也是\(1\),而\(0\)对应\(0,1\)都可以。

设输入的这行状态为\(a[i]\),分配时的这行状态为\(x\),则用位运算来表示上述条件即\((\sim a[i])\&x=0\),设其为函数\(judge(i,x)\)。

因为每个草场不能相邻,对于每一行,可以先预处理出在二进制下没有\(1\)是相邻的所以数,记录在集合\(S\)中,集合大小为\(l\);对于列上要求不相邻,即上下两行不能有\(1\)相邻,即\(i\&(i-1)=0\)。

定义\(f[i][j]\)表示分配至第\(i\)行,第\(i\)行的状态为\(j\)。

\(\qquad\qquad f[i][j]=\sum\limits_{k=0,judge(i-1,S[k])\text{且}i\&(i-1)=0}^{l-1}f[i-1][k],\text{其中}i,j\text{满足}judge(i,S[j])\)

最终结果即是\(\sum\limits_{i=0}^{l-1}f[n][i]\)。

另外,在\(DP\)时记得对\(10^9\)进行取模。

#include<cstdio>
using namespace std;
const int N = 13;
const int M = 400;
const int mod = 1e9;
int f[N][M], a[N], S[M];
int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c<'0' || c>'9'; c = getchar())
p = (c == '-' || p) ? 1 : 0;
for (; c >= '0'&&c <= '9'; c = getchar())
x = x * 10 + (c - '0');
return p ? -x : x;
}
bool judge(int x, int y)
{
if ((~a[x]) & y)
return false;
return true;
}
int main()
{
int i, j, n, m, l = 0, k, o;
n = re();
m = re();
o = 1 << m;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
a[i] |= (re() << (m - j));
for (i = 0; i < o; i++)
if (!(i&(i << 1)))
k = S[l++] = i;
f[0][0] = 1;
for (i = 1; i <= n; i++)
for (j = 0; j < l; j++)
if (judge(i, S[j]))
for (k = 0; k < l; k++)
if (judge(i - 1, S[k]) && !(S[j] & S[k]))
(f[i][j] += f[i - 1][k]) %= mod;
for (k = i = 0; i < l; i++)
(k += f[n][i]) %= mod;
printf("%d", k);
return 0;
}

POJ3254或洛谷1879 Corn Fields的更多相关文章

  1. 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field

    我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...

  2. 洛谷2212Watering the Fields S 最小生成树

    题目链接:https://www.luogu.com.cn/problem/P2212 几乎是Kruskal裸题,但是建n*(n-1)条边给我T了俩点,后来我发现只要C(n,2)条边就可以,因为假设( ...

  3. 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ...

  4. 【题解】洛谷P1879 [USACO06NOV] Corn Fields(状压DP)

    洛谷P1879:https://www.luogu.org/problemnew/show/P1879 思路 把题目翻译成人话 在n*m的棋盘 每个格子不是0就是1 1表示可以种 0表示不能种 相邻的 ...

  5. 【洛谷P1879】玉米田Corn Fields

    玉米田Corn Fields 题目链接 此题和互不侵犯状压DP的做法类似 f[i][j]表示前i行,第i行种植(1)/不种植(0)构成的二进制数为j时的方案数 首先我们可以预处理出所有一行中没有两个相 ...

  6. 状压DP【洛谷P1879】 [USACO06NOV]玉米田Corn Fields

    P1879 [USACO06NOV]玉米田Corn Fields 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形 ...

  7. C++ 洛谷 P1879 [USACO06NOV]玉米田Corn Fields

    没学状压DP的看一下 合法布阵问题  P1879 [USACO06NOV]玉米田Corn Fields 题意:给出一个n行m列的草地(n,m<=12),1表示肥沃,0表示贫瘠,现在要把一些牛放在 ...

  8. 洛谷 P1879 [USACO06NOV]玉米田Corn Fields 题解

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 Farmer John has purchased a lush new rectangular pasture compo ...

  9. POJ3254:Corn Fields——题解

    http://poj.org/problem?id=3254 题面来自洛谷:https://www.luogu.org/problemnew/show/1879 农场主John新买了一块长方形的新牧场 ...

随机推荐

  1. ABAP 字符串函数

    CONCATENATE:合并字符串. CONCATENATE f1 … fn INTO g [SEPARATED BY h]. 1 * CONCATENATE合并字符串 2 DATA: c1(10) ...

  2. echarts 树图

    1 事件:事件绑定,事件命名统一挂载到require('echarts/config').EVENT(非模块化为echarts.config.EVENT)命名空间下,建议使用此命名空间作为事件名引用, ...

  3. Linq to sql 之 ExecuteQuery 错误:指定的转换无效

    问题:通过dbContext.ExecuteQuery 得到数据并赋值给一个集合. 代码: public IEnumerable<LeaveCodeSum> GetLeavTotal(st ...

  4. oracle学习--循环语句

    oracle学习--循环语句  loop循环: create or replace procedure pro_test_loop is i number; begin i:=0; loop i:=i ...

  5. centos7.4上安装python3环境的坑

    前言:为了将爬虫项目布置到服务器上,才有了今天这一下午的坑,必须记录 不要动现有的python2环境!不要动现有的python2环境!不要动现有的python2环境! 解压 tar -xvf Pyth ...

  6. 如何用 Postman 处理 json请求格式

    下边是其他博友写的 http://blog.163.com/huan12_8/blog/static/130519090201611711213719/

  7. IMPDP NETWORK_LINK参数

    在<[IMPDP]同一数据库实例不同用户间数据迁移复制—— NETWORK_LINK参数>(http://space.itpub.net/519536/viewspace-631571)文 ...

  8. python--第二天总结

    一.作用域只要变量在内存中存在,则就可以使用.(栈) 二.三元运算result = 值result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result ...

  9. ucore-lab1-练习3report

    练习3.分析bootload进入保护模式的过程 0. BIOS通过读取硬盘主引导扇区到内存,并跳转到对应内存中的位置,也就是从’%cs=0 $pc=0x7c00‘进入并执行bootloader,boo ...

  10. 第十章 优先级队列 (b3)完全二叉堆:删除与下滤