我要开状压dp的坑了。。直播从入门到放弃系列。。

那就先拿一道状压dp的水题练练手吧。。

然后就找到了这一道。。这道题使我清醒地认识到阻碍我的不是算法,而是视力= =

传送门:
poj:http://poj.org/problem?id=3254
luogu:https://www.luogu.org/problem/show?pid=1879.233333 (雾

题目大意:

n*m的01矩阵上放棋子(牛),不能放到相邻格子,问方案数。(啥也不放算一种方案(然而我视力好到看到这一点了))

题目分析:

都说了状压dp 水题肯定要用仙人图上在线分支定界启发式带花树上下界最小费用流解决问题啊~(什么鬼)

我们可以看出,我们可以通过i-1行的放法转移出第i行的放法,所以这题是dp无疑。状态转移方程:

第i行状态为j(j合法):
f[i][j]=sigma(f[i-1][k]) (k与j不冲突)

然而j是一种状态而不是一个数字。所以这就是本题不同于传统dp的地方,我们要状压

嗯,状压,什么是状压? 状态压缩
那什么是状态压缩?
以本题为例,我们发现n,m的范围很小(其实有一维的范围很小就可以O(∩_∩)O)
而每一个格子上都只有放牛和不放牛两种选择,所以……
既然是学信息的,我们可以用二进制来表示啊~

我们可以用不超过12位二进制来表示当前行中的状态,从而完成了压缩。。 还有可爱的位运算为伴哦~

大体来说就是这样。。

如何筛选合法状态?

题目中,对于同一行中相邻的情况,我们可以用(i&(i-1))解决..
对于行之间相邻的情况,把两行按位与一下即可。。

每一行枚举复杂度不会爆炸吗?

(本题不存在此担心,2^12^2勉强能跑过,但有些题是30左右就hold不住了..)
这个放心即可。。我们可以先预处理。。然后发现可枚举的状态其实是十分有限的..

预处理大概是长介个样纸:

for(int i=0;i<1<<m;i++)
if(!(i&(i<<1))){
op[cnt++]=i;
}

经实测,在2^12=4096个状态中,能在1行中合法存在的只有377个。。(要算错了可以来纠正我_ (:з」∠) _反正我日常算错。。不过算错应该不会差多少)

总之不会爆炸,而且还跑得很快就对了~~

啰嗦了半天,还是上代码吧。。

代码实现

#include <cstdio>
#include <cstring> int op[380],cnt,n,m,ans;
int f[13][380],za[13]; void dp(){
for(int i=0;i<1<<m;i++)
if(!(i&(i<<1))){
op[cnt]=i;
if(!(i&za[0])) f[0][cnt]=1;
cnt++;
}
for(int i=1;i<n;i++)
for(int j=0;j<cnt;j++){
if(op[j]&za[i]) continue;
for(int k=0;k<cnt;k++)
if(!(op[j]&op[k]))
f[i][j]+=f[i-1][k];
}
} int main(){
scanf("%d%d",&n,&m);
ans=0; cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
int k; scanf("%d",&k);
if(!k) za[i]|=(1<<j);
}dp();
for(int i=0;i<cnt;i++) ans=(ans+f[n-1][i])%100000000;
printf("%d\n",ans);
}

大概就这样吧。。

文末彩蛋
为什么我说这题卡视力了呢?
因为我前几遍硬是没看见取模~
还到luogu下了一次数据才看出来。。
我多半是完了_ (:з」∠) _

【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field的更多相关文章

  1. 洛谷 P1879 玉米田Corn Fields 题解

    题面 一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意: f[i][j]表示前i行最后一行状态是j的方案数 #include <bits/stdc++.h> #define p ...

  2. 洛谷 P1879 玉米田(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int M,N; int plant[maxn][maxn];/ ...

  3. 洛谷P1879 玉米田

    题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地.John打算在牧场上的某几格里种上美味的草,供他 ...

  4. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  5. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

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

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

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

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

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

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

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

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

随机推荐

  1. BZOJ 3534: [Sdoi2014]重建(Matrix Tree)

    传送门 解题思路 比较容易看的出来矩阵树定理.然后就怒送一Wa,这个矩阵树定理是不能直接用的.题目要求的其实是这个玩意. \[ ans=\sum\limits_{Tree}( \prod\limits ...

  2. NX二次开发-UFUN获得图纸页数量UF_DRAW_ask_num_drawings

    #include <uf.h> #include <uf_draw.h> #include <uf_ui.h> UF_initialize(); //获得有多少张图 ...

  3. NX二次开发-UFUN替换组件UF_ASSEM_substitute_component

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> #include <u ...

  4. 其它课程中的python---3、numpy总结(非常全)

    其它课程中的python---3.numpy总结(非常全) 一.总结 一句话总结: 学习方式应该是:听课+总结:-->找总结博客+再总结 需要始终记住:凭借,继承,复用 1.numpy的主要功能 ...

  5. python爬取文件时,内容为空

    解决方式: img_res = requests.get(src,headers=header)在header中加上referer防盗链加上防盗链header的例子: header = {" ...

  6. grep 的一些常用用法

    打印匹配到的上下5行 grep -C 5 'root' /etc/passwd            上下5行 grep -A 5 'root' /etc/passwd            afte ...

  7. 29-Ubuntu-远程管理命令-03-SSH工作方式简介

    在Linux中SSH是非常重要的工具,通过SSH客户端可以连接到运行了SSH服务器的远程机器上. 1.SSH客户端是一种使用Secure Shell(SSH)协议连接到远程计算机的软件程序. 2.SS ...

  8. Java oop第05章_多态、接口

    一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可 ...

  9. 【2-SAT】[JSOI2010]满汉全席

    感觉方法和题解差不多,但是题解写的好烦啊...也不是烦,就是很复杂 这里建议开一个数组表示当前这个点选或者不选的编号,这样之后自己理思路也会清楚一点 然而我调了一个小时才发现我是Tarjan写错了.. ...

  10. 【学术篇】NOIP2017 d2t3 列队phalanx splay做法

    我可去他的吧.... ==============先胡扯些什么的分割线================== 一道NOIP题我调了一晚上...(其实是因为昨晚没有找到调试的好方法来的说...) 曾经我以 ...