【CF845F】Guards In The Storehouse

题意:一个n*m的房间,每个格子要么是障碍要么是空地。对于每个空地你可以选择放或者不放守卫。一个守卫能保护到的位置是:他右面的一行空地+下面的一列空地,但是不能穿过障碍(可以穿过另一个守卫)。现在要求至多有1个空地没有被保护,求放置守卫的方案数。

$n\times m\le 250$

题解:n和m中较小者不超过15,所以插头DP不解释~

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int P=1000000007;
int f[2][(1<<16)+1][2];
int n,m,msk,ans;
char str[255][255];
inline void upd(int &x,int y) {x+=y; if(x>=P) x-=P;}
int main()
{
scanf("%d%d",&n,&m);
int i,j,d=0,S,T,p,q,x,y,v0,v1;
for(i=0;i<n;i++) scanf("%s",str[i]);
if(n<m)
{
for(i=0;i<n;i++) for(j=i;j<m;j++) swap(str[i][j],str[j][i]);
swap(n,m);
}
msk=(1<<(m+1))-1,f[0][0][0]=1;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
d^=1,memset(f[d],0,sizeof(f[d]));
for(S=0;S<=msk;S++)
{
x=j,y=j+1,p=(S>>x)&1,q=(S>>y)&1,T=S^(p<<x)^(q<<y),v0=f[d^1][S][0],v1=f[d^1][S][1];
if(!v0&&!v1) continue;
if(str[i][j]=='x')
{
upd(f[d][T][0],v0),upd(f[d][T][1],v1);
continue;
}
upd(f[d][T|(1<<x)|(1<<y)][0],v0),upd(f[d][T|(1<<x)|(1<<y)][1],v1);
if(p||q) upd(f[d][T|(q<<x)|(p<<y)][0],v0),upd(f[d][T|(q<<x)|(p<<y)][1],v1);
else upd(f[d][T][1],v0);
}
}
d^=1,memset(f[d],0,sizeof(f[d]));
for(S=0;S<=msk;S++) upd(f[d][(S<<1)&msk][0],f[d^1][S][0]),upd(f[d][(S<<1)&msk][1],f[d^1][S][1]);
}
for(S=0;S<=msk;S++) upd(ans,f[d][S][0]),upd(ans,f[d][S][1]);
printf("%d",ans);
return 0;
}//1 4 ....

【CF845F】Guards In The Storehouse 插头DP的更多相关文章

  1. Educational Codeforces Round 27 F. Guards In The Storehouse

    F. Guards In The Storehouse time limit per test 1.5 seconds memory limit per test 512 megabytes inpu ...

  2. 插头dp

    插头dp 感受: 我觉得重点是理解,算法并不是直接想出怎样由一种方案变成另一种方案.而是方案本来就在那里,我们只是枚举状态统计了答案. 看看cdq的讲义什么的,一开始可能觉得状态很多,但其实灰常简单 ...

  3. HDU 4113 Construct the Great Wall(插头dp)

    好久没做插头dp的样子,一开始以为这题是插头,状压,插头,状压,插头,状压,插头,状压,无限对又错. 昨天看到的这题. 百度之后发现没有人发题解,hust也没,hdu也没discuss...在acm- ...

  4. HDU 4949 Light(插头dp、位运算)

    比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...

  5. 插头DP专题

    建议入门的人先看cd琦的<基于连通性状态压缩的动态规划问题>.事半功倍. 插头DP其实是比较久以前听说的一个东西,当初是水了几道水题,最近打算温习一下,顺便看下能否入门之类. 插头DP建议 ...

  6. HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)

    插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...

  7. HDU 1693 Eat the Trees(插头DP)

    题目链接 USACO 第6章,第一题是一个插头DP,无奈啊.从头看起,看了好久的陈丹琦的论文,表示木看懂... 大体知道思路之后,还是无法实现代码.. 此题是插头DP最最简单的一个,在一个n*m的棋盘 ...

  8. HDU 4064 Carcassonne(插头DP)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4064 Problem Description Carcassonne is a tile-based ...

  9. URAL 1519 基础插头DP

    题目大意: 给定一个图,一部分点'*'作为障碍物,求经过所有非障碍点的汉密尔顿回路有多少条 基础的插头DP题目,对于陈丹琦的论文来说我觉得http://blog.sina.com.cn/s/blog_ ...

随机推荐

  1. ApkTool反编译和重新打包

    有时会需要反编译APK,各人有各人的原因,你都懂的…… 准备工作: 下载APKTool,通过下面这个连接进行下载,https://code.google.com/p/android-apktool/d ...

  2. 提高OCR质量的技巧之区域未正确检测

    ABBYY FineReader会在识别前分析页面图像并检测图片上不同类型的区域,如文本.图片.背景图片.表格和条形码区域,此分析确定识别的区域和识别顺序.在用户界面中,不同的区域类型按其边界的颜色进 ...

  3. BarTender表单的人性化设计—分组框

    BarTender 2016已经支持用户输入信息.从相同位置查询数据库和筛选数据记录,那就是数据输入表单了.这个功能相信迎合了很多用户的需求,主要作用体现在打印时数据输入. 对于表单的设计,不同的客户 ...

  4. MathType输入框怎么调整

    在用MathType编辑公式编辑器时,除了可以对MathType工具栏的显示比例进行调整以外,还可以对编辑时的输入框进行调整.这样在编辑的过程中,工具栏可以看得很清楚,同时框输入框也可以看得很清楚,这 ...

  5. 用VS2012不能打开VS2010的项目

    应该是装过sql2012或者sql2008,自带的那个visual studio,你可以直接在外面打开VS2012,然后用里面的文件去打开项目.而不要直接双击那个解决方案的文件.

  6. vim中文手册

    http://vimcdoc.sourceforge.net/doc/help.html

  7. Gulp--Less

    摘要: 前面分享了一些less的是用方法,包括在grunt中,今天在分享下使用gulp来编译less文件.首先需要安装gulp,如何安装请看文章. 安装插件: gulp编译less使用了gulp-le ...

  8. [Algorithm] Deferred Acceptance Algorithm

    约会配对问题 一.立即接受算法: 对于约会的配对,大家都去追自己最心仪的女生.而这个女生面对几位追求者,要立刻做个决定. 被拒绝的男生们调整一下心情,再去追求心中的 No. 2.以此类推. 这样做法有 ...

  9. 转换python脚本为可执行程序的方式

    背景: 部分工具使用python脚本编写,而目标服务器,没有安装python包,导致使用工具不方便,还需要另外安装python. 目前主要有2个主流软件,可做此类转换,把对应工具脚本转换为exe: p ...

  10. django学习笔记:AdminSite界面配置

    (一)重定义字段顺序: 修改对应应用目录下的admin.py class PollAdmin(admin.ModelAdmin):     fields = ['pub_date', 'questio ...