【BZOJ】2331: [SCOI2011]地板
题目链接: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]地板的更多相关文章
- bzoj 2331: [SCOI2011]地板 插头DP
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- BZOJ 2331 [SCOI2011]地板 ——插头DP
[题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...
- bzoj 2331: [SCOI2011]地板【插头dp】
一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- 2331: [SCOI2011]地板 插头DP
国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...
- 【BZOJ2331】[SCOI2011]地板 插头DP
[BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...
- BZOJ 2331 地板
妈妈我会写插头dp了!!!!!!.... 感动啊... #include<iostream> #include<cstdio> #include<cstring> ...
- BZOJ2331:[SCOI2011]地板——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2331 题面复制于洛谷 题目描述 lxhgww的小名叫”小L“,这是因为他总是很喜欢L型的东西.小L家 ...
随机推荐
- inux 驱动程序开发中输入子系统总共能产生哪些事件类型(EV_KEY,EV_ABS,EV_REL)
inux 驱动程序开发中, 输入子系统总共能产生哪些事件类型?,以及分别是什么意思?详见如下: Linux中输入设备的事件类型有EV_SYN 0x00 同步事件EV_KEY 0x01 按键事件,如KE ...
- Codeforce 294A - Shaass and Oskols (模拟)
Shaass has decided to hunt some birds. There are n horizontal electricity wires aligned parallel to ...
- The Little Prince-12/11
The Little Prince-12/11 最后一段话!!!hha,傻傻的我们...... 成人们对数字情有独钟.如果你为他们介绍一个朋友,他们从不会问你“他的嗓子怎么样?他爱玩什么游戏?他会采集 ...
- Git 常用命令列表
1 常用 $ git remote add origin git@github.com:yeszao/dofiler.git # 配置远程git版本库 $ git pull origin master ...
- Dubbox分布式框架之入门
Dubbox简介 Dubbox是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbox,被国内电商及换联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护, ...
- linux 安装sqlite3
python2个版本导致的问题. 网上找了好多方法都不行. 最后自己莫名其妙弄好了, 回想了一下大概是 安装sqlite3 重新安装python 最后 yum update 更新 就好了.
- 2018-2019-1 20189206 《Linux内核原理与分析》第五周作业
linux内核分析学习笔记 --第四章 系统调用的三层机制 学习重点--系统调用 用户态.内核态和中断 Intel x86 CPU有四种不同的执行级别,分别是0,1,2,3其中数字越小,特权越高. L ...
- 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析20165211
目录 实践内容概述 实践目标 实践内容 实验问题回答 实践过程记录 系统运行监控 使用schtacks指令监控系统运行 使用sysmon工具监控系统运行 恶意软件分析 使用Virus Total分析恶 ...
- 集合框架-ArrayList,Vector,Linkedlist
// ClassCastException 报错,注意,千万要搞清楚类型 * Vector的特有功能: * 1:添加功能 * public void addElement(Object obj) -- ...
- 前端 --- 2 css
一. CSS的几种引入方式 1.行内样式 2.内部样式 写在网页的<head></head>标签对的<style></style>标签对中 3.外部样式 ...