【题意】给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数。L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸。n*m<=100。

【算法】插头DP

【题解】状态0表示无插头,1表示能拐弯的插头,2表示不能拐弯的插头。(有插头,方块就必须必须延伸到该格),考虑转移即可。

注意可以凭空产生一个能拐弯的插头。

n*m<=100,当m>10的时候将i,j互换。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=,MM=,MOD=,S=;
int map[maxn][maxn],n,m,c[maxn];
int M(int x){return x>=MM?x-MM:x;}
struct h{
int state[S],ans[S],first[MOD],tot,nxt[S];
void init(){
memset(first,,sizeof(first));
tot=;
}
void insert(int x,int num){
for(int i=first[x%MOD];i;i=nxt[i])if(state[i]==x){
ans[i]=M(ans[i]+num);
return;
}
state[++tot]=x;ans[tot]=num;
nxt[tot]=first[x%MOD];first[x%MOD]=tot;
}
}f[];
void decode(int x){for(int i=m;i>=;i--)c[i]=x&,x>>=;}
int encode(){int x=;for(int i=;i<=m;i++)x=(x<<)|c[i];return x;}
void solve(int cur,int x,int y){
for(int k=;k<=f[cur^].tot;k++){
decode(f[cur^].state[k]);
int ans=f[cur^].ans[k],left=c[y-],up=c[y];
if(left==){
if(up==){
if(map[x][y+]&&map[x+][y]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
if(map[x+][y]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
if(map[x][y+]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
}
if(up==){
if(map[x+][y]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
if(map[x][y+]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
}
if(up==){
if(map[x+][y]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
}
if(left==){
if(up==){
if(map[x+][y]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
if(map[x][y+]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
}
if(up==){
c[y-]=c[y]=;
f[cur].insert(encode(),ans);
}
}
if(left==){
if(up==){
if(map[x][y+]){
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
c[y-]=;c[y]=;
f[cur].insert(encode(),ans);
}
}
}
}
char s[maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%s",s+);
for(int j=;j<=m;j++)if(s[j]=='_'){
if(m<=)map[i][j]=;else map[j][i]=;
}
}
if(m>)swap(n,m);
int cur=;f[].init();f[].insert(,);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)if(map[i][j]){
f[cur^=].init(),solve(cur,i,j);
}
for(int j=;j<=f[cur].tot;j++)f[cur].state[j]>>=;
}
int ans=;
for(int i=;i<=f[cur].tot;i++)ans=M(ans+f[cur].ans[i]);
printf("%d",ans);
return ;
}

经历:开始看错题,以为是向右向下延伸的方块,就1表示可以延伸的插头,2表示必须延伸的插头。

但其实这也是不必要的,插头DP通常强制限定插头指向的方块必须选择,而在之前插的时候提前判断是否能选。

【BZOJ】2331: [SCOI2011]地板 插头DP的更多相关文章

  1. bzoj 2331: [SCOI2011]地板 插头DP

    2331: [SCOI2011]地板 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 239[Submit][Status] D ...

  2. BZOJ 2331 [SCOI2011]地板 ——插头DP

    [题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...

  3. 2331: [SCOI2011]地板 插头DP

    国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...

  4. 【BZOJ2331】[SCOI2011]地板 插头DP

    [BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...

  5. bzoj:2331: [SCOI2011]地板

    Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...

  6. bzoj 2331: [SCOI2011]地板【插头dp】

    一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...

  7. 【BZOJ】2331: [SCOI2011]地板

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...

  8. [SCOI2011][bzoj2331] 地板 [插头dp]

    题面: 传送门 思路: 插头dp基础教程 这个L形......第一眼看上去真的是丧病啊 但是仔细想想,实际上也就是拿一堆路径铺满一个棋盘,这个路径还是有限制的 那还有什么好说的,插头dp上啊[雾] 首 ...

  9. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

随机推荐

  1. CentOS7安装.NET Core运行环境

    安装.NET Core ->首先需要删除以前安装的版本 -> 获取安装脚本 curl -sSL https://raw.githubusercontent.com/dotnet/cli/r ...

  2. 简述Java中Http/Https请求监听方法

    一.工欲善其事必先利其器 做Web开发的人总免不了与Http/Https请求打交道,很多时候我们都希望能够直观的的看到我们发送的请求参数和服务器返回的响应信息,这个时候就需要借助于某些工具啦.本文将采 ...

  3. Struts2(四)

    以下内容是基于导入struts2-2.3.32.jar包来讲的 1.struts2配置文件加载的顺序 struts2的StrutsPrepareAndExecuteFilter拦截器中对Dispatc ...

  4. PECE

     CE客户端边界路由器.与PE设备直连,主要功能是将VPN客户的路由通告给PE,以及从PE学习同一个VPN下其他站点的路由.PE和CE直连的运营商设备(运营商边界路由器). #PE和CE也可以是用一台 ...

  5. 软件工程个人作业3——集大通APP案例分析

    第一部分:调研, 评测 1.第一次上手体验 主要界面截图: 感受: 1.界面不美观: 2.特色功能展现模块不突出,以上截图为打开APP所看到的界面展示,但是这些功能都不是该APP的特色功能,显得有些累 ...

  6. week1读构建之法-读书笔记

    最开始听见杨老师说邹欣老师这个名字总觉得很熟悉,后来看见博客上老师的头像恍然大悟,原来机缘巧合已经在微博上关注邹老师许久,一直觉得邹老师是个很有意思的人,兴趣一定十分广泛,看了老师的书确实能感觉到邹老 ...

  7. 使用JsonConfig中的setExcludes方法过滤不需要转换的属性

    Hibernate的many-to-one双向关联中,查询many方时会将one方数据顺带着查询,同时one中会有List<Many>,然后又会去查Many中的数据... 周而复始,结果j ...

  8. H5跳转到百度地图并定位

    找了半天的JS api,发现没有,后来发现这个叫 url api,让我好找. 官方文档: http://lbsyun.baidu.com/index.php?title=uri/api/web : 简 ...

  9. BZOJ 2190 仪仗队(线性筛欧拉函数)

    简化题意可知,实际上题目求得是gcd(i,j)=1(i,j<=n)的数对数目. 线性筛出n大小的欧拉表,求和*2+1即可.需要特判1. # include <cstdio> # in ...

  10. BZOJ4922 Karp-de-Chant Number(贪心+动态规划)

    首先将每个括号序列转化为三元组(ai,bi,ci),其中ai为左括号-右括号数量,bi为前缀最小左括号-右括号数,ci为序列长度.问题变为在满足Σai=0,bi+Σaj>=0 (j<i)的 ...