题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331


一眼插头DP...

考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了弯的还是没有拐弯的。
所以$4$进制表示,$0$表示没有插头,$1$表示插头指向拐点,$2$表示插头离开拐点。

转移:

令${(x,y)}$表示当前点左插头和上插头的形态。

${(0,0)}$------>${(0,1)}$,${(1,0)}$,${(2,2)}$

${(0,1)}$------>${(1,0)}$,${(0,2)}$

${(0,2)}$------>${(0,0)}$,${(2,0)}$

${(1,0)}$------>${(0,1)}$,${(2,0)}$

${(2,0)}$------>${(0,0)}$,${(0,2)}$

当然如果有障碍就不能走。


 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10010
#define llg long long
#define SIZE 10007
#define md 20110520
#define maxnZT (1<<21)
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,code[maxn],zt[][maxnZT],v[][maxnZT],g[][],size[],now,la; struct node
{
llg pos,x,val;
}; vector<node>a[][SIZE]; void outcode(llg x){for (llg i=;i<=m;i++) code[i]=x&,x>>=;} void encode(llg p,llg val)
{
llg x=;
for (llg i=;i<=m;i++) x+=code[i]*(<<(i*));
llg wz=x%SIZE,E=a[p][wz].size();
for (llg i=;i<E;i++)
if (a[p][wz][i].x==x)
{
a[p][wz][i].val+=val; a[p][wz][i].val%=md;
v[p][a[p][wz][i].pos]+=val; v[p][a[p][wz][i].pos]%=md;
return ;
}
size[p]++;
node NEW;
NEW.pos=size[p],NEW.x=x,NEW.val=val;
a[p][wz].push_back(NEW);
zt[p][size[p]]=x; v[p][size[p]]=val;
} void init()
{
cin>>n>>m;
char ch;
for (llg i=;i<=n;i++)
for (llg j=;j<=m;j++)
{
ch=getchar();
while (ch!='*' && ch!='_') ch=getchar();
if (n<m) g[j][i]=(ch=='_');
else g[i][j]=(ch=='_');
}
if (n<m) swap(n,m);
} void init_a(llg p){for (llg i=;i<SIZE;i++) a[p][i].clear(); size[p]=;} void DP()
{
llg le,up,V;
encode(,);
for (llg i=;i<=n;i++)
{
for (llg k=;k<=size[now];k++) zt[now][k]*=;//轮廓线左移一格
for (llg j=;j<=m;j++)
{
now^=; la=now^; size[now]=;
init_a(now);
for (llg k=;k<=size[la];k++)
{
outcode(zt[la][k]);
le=code[j-],up=code[j],V=v[la][k];//提取左插头和上插头 if (g[i][j]==)
{
if (le== && up==) encode(now,V);
continue;
} if (!le && !up)
{
if (j<m && g[i][j+]==)
{
code[j-]=,code[j]=;
encode(now,V);
if (g[i+][j]==)
{
code[j-]=code[j]=;
encode(now,V);
}
}
if (g[i+][j]==)
{
code[j-]=,code[j]=;
encode(now,V);
}
continue;
} if (le && up)
{
if (le== && up==)
{
code[j-]=code[j]=;
encode(now,V);
}
continue;
} if (le== && up==)
{
if (g[i+][j]==)
{
code[j-]=;
encode(now,V);
}
if (g[i][j+]== && j<m)
{
code[j]=; code[j-]=;
encode(now,V);
}
continue;
} if (le== && up==)
{
if (j<m && g[i][j+]==)
{
code[j]=; code[j-]=;
encode(now,V);
}
code[j]=code[j-]=;
encode(now,V);
continue;
} if (le== && up==)
{
if (g[i+][j]==)
{
code[j-]=,code[j]=;
encode(now,V);
}
if (j<m && g[i][j+]==)
{
code[j-]=; code[j]=;
encode(now,V);
}
continue;
} if (le== && up==)
{
if (g[i+][j]==)
{
code[j]=,code[j-]=;
encode(now,V);
}
code[j-]=code[j]=;
encode(now,V);
continue;
}
}
}
}
} int main()
{
yyj("BZOJ2331");
init();
DP();
llg ans=;
bool pd;
for (llg i=;i<=size[now];i++)
{
outcode(zt[now][i]);
pd=true;
for (llg j=;j<=m;j++) if (code[j]) pd=false;
if (pd) ans+=v[now][i];
}
cout<<ans%md;
return ;
}

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

  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]地板

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

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

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

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

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

  5. 【BZOJ】2331: [SCOI2011]地板 插头DP

    [题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...

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

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

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

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

  8. BZOJ 2331 地板

    妈妈我会写插头dp了!!!!!!.... 感动啊... #include<iostream> #include<cstdio> #include<cstring> ...

  9. BZOJ2331:[SCOI2011]地板——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2331 题面复制于洛谷 题目描述 lxhgww的小名叫”小L“,这是因为他总是很喜欢L型的东西.小L家 ...

随机推荐

  1. Codeforces 268B - Buttons

    Manao is trying to open a rather challenging lock. The lock has n buttons on it and to open it, you ...

  2. AtCoder Beginner Contest 045 B - 3人でカードゲームイージー / Card Game for Three (ABC Edit)

    Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement Alice, Bob and Charlie ...

  3. Spring基于的注解自动装配和依赖注入(***)

    #自动装配的小Demo: package com.gyf.annotation; //DAO层 public interface UserDao { public void save(); } pac ...

  4. CI(CodeIgniter)框架下使用非自带类库实现邮件发送

    在项目开发过程中,需要到了邮件提醒功能.首先想到的是CI自身带不带邮件发送类,查看帖子,发现CI本身自带,然后试着利用CI自身带的类库来实现,经过搜搜很多帖子,不少开发者反馈CI自身的Email类有问 ...

  5. JDK JRE JVM的区别

    Jdk[Java Development ToolKit]就是java开发工具箱, JDK是整个JAVA的核心,里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编 ...

  6. Linux Centos 7.4 内核升级

    Linux Centos 7.4 内核升级 原始内核版本:3.10.0-693.2.2.el7.x86_64 升级内核版本:4.14.9-1.el7.elrepo.x86_64 1.导入key Key ...

  7. Redis随笔-rename效率问题

    背景 rename是redis中给key重命名命令,rename key newkey的意思就是将key重命名为newkey.大部分文档在介绍rename的时候只将它描述成一个时间复杂度为O(1)的命 ...

  8. Huffman Implementation with Python

    Huffman Implementation with Python 码表 Token Frequency a 10 e 15 i 12 s 3 t 4 space 13 n 1 生成 Huffman ...

  9. Python3.6.2在线安装pymysql模块

    我是一个python新手刚才使用python写邮件发送代码的时候想着需要连接数据库, 下面的安装步骤 python -m pip install pymysql PS C:\Users\hp> ...

  10. [c/c++] programming之路(1)、编写程序打开记事本、计算器等

    一.命令行启动程序 通过命令行关闭程序:taskkill /f /im 程序名.exe 二.打开记事本.计算器 #include <stdlib.h> void main(){ syste ...