【BZOJ】2331: [SCOI2011]地板 插头DP
【题意】给定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的更多相关文章
- bzoj 2331: [SCOI2011]地板 插头DP
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
- BZOJ 2331 [SCOI2011]地板 ——插头DP
[题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...
- 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: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- bzoj 2331: [SCOI2011]地板【插头dp】
一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...
- 【BZOJ】2331: [SCOI2011]地板
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...
- [SCOI2011][bzoj2331] 地板 [插头dp]
题面: 传送门 思路: 插头dp基础教程 这个L形......第一眼看上去真的是丧病啊 但是仔细想想,实际上也就是拿一堆路径铺满一个棋盘,这个路径还是有限制的 那还有什么好说的,插头dp上啊[雾] 首 ...
- BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)
BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...
随机推荐
- Hibernate(七)
三套查询之HQL查询(原文再续书接上一回) where子句部分(查询过滤部分) Hibernate的where子句部分能支持的运算符,表达式.函数特别多,用法与sql语句是一样的. 常用的表达式.运算 ...
- jdbc 4.0
1.存储MySQL数据库的date.time.timestamp.datetime以及year类型数据 package com.rong.jielong; import java.sql.Connec ...
- java.lang.NoClassDefFoundError: Lcom/opensymphony/xwork2/util/logging/Logger tomcat6 启动错误
用tomcat6启动时,出现下面的错误Java.lang.NoClassDefFoundError: Lcom/opensymphony/xwork2/util/logging/Logger; Cau ...
- 彻底解决Webpack打包慢的问题
转载 这几天写腾讯实习生 Mini 项目的时候用上了 React 全家桶,当然同时引入了 Webpack 作为打包工具.但是开发过程中遇到一个很棘手的问题就是,React 加上 React-Route ...
- J2EE十三种技术规范介绍
J2EE的十三个技术规范 J2EE体系结构 一.JDBC:Java Data Base Connectivity,数据库连接 我们大家对微软公司的ODBC数据库访问接口比较熟悉,而在Java中创建数据 ...
- 在js和C#中split应用和去除字符串分组后的空值
如字符串 string answer="A,B,D,",在 js和 C#按","分成数组 js: , useranswer.length - ).split(& ...
- 【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序
前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...
- [HNOI2002]跳蚤 【容斥】
题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最 ...
- 20135239益西拉姆 Linux内核分析 汇编一个简单的c程序并分析其指令过程
益西拉姆+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第一周linux内核分析 学习笔记 一.计算机 ...
- html5 video,audio控制播放多次,请求/监测全屏状态
audio 播放 Element.play(); 如果在播放中,调用play,从头播放,则需要先load,同时绑定结束方法,如 Element.addEventListener('ended',f ...