[BZOJ2331]地板(插头DP)
Description
lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西。小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板。现在小L想知道,用L型的地板铺满整个客厅有多少种不同的方案?
需要注意的是,L型地板的两端长度可以任意变化,但不能长度为0。铺设完成后,客厅里面所有没有柱子的地方都必须铺上地板,但同一个地方不能被铺多次。
R*C<=100
Solution
插头DP,用三进制表示状态,0表示无插头,1表示有插头且可以转向,2表示有插头但不可转向
转移如下,
- 00 To 22/10/01
- 11 To 00
- 10 To 20/01
- 20 To 00/02
- 01 To 10/02
- 02 To 00/20
Code
#include <cstdio>
#include <algorithm>
#define N 14
using namespace std;
const int mod=20110520;
int n,m,A[N],now,dp[2][N][200000];//滚动数组
char g[N][N];
int main(){
A[0]=1;for(int i=1;i<=12;++i)A[i]=A[i-1]*3;
scanf("%d%d\n",&n,&m);
for(int i=1;i<=n;++i,scanf("\n"))
for(int j=1;j<=m;++j)
if(n>m) scanf("%c",&g[i][j]);else scanf("%c",&g[j][i]);
if(n<m) swap(n,m);//将大的用来滚动
dp[0][m][0]=1;
for(int i=1;i<=n;++i){
now^=1;
for(int j=0;j<A[m];++j) dp[now][0][j*3]=dp[now^1][m][j];
for(int j=1;j<=m;++j)
for(int k=0;k<A[m+1];++k){
int l=k/A[j-1]%3,r=k/A[j]%3;
if(g[i][j]=='_'){
if(!l&&!r) dp[now][j][k]=(dp[now][j-1][k+(A[j]<<1)+(A[j-1]<<1)]+dp[now][j-1][k+A[j]]+dp[now][j-1][k+A[j-1]])%mod;
else if(l==1&&r==1) dp[now][j][k]=dp[now][j-1][k-A[j]-A[j-1]];
else if(l==1&&!r) dp[now][j][k]=(dp[now][j-1][k+A[j-1]]+dp[now][j-1][k-A[j-1]+A[j]])%mod;
else if(l==2&&!r) dp[now][j][k]=(dp[now][j-1][k-(A[j-1]<<1)]+dp[now][j-1][k-(A[j-1]<<1)+(A[j]<<1)])%mod;
else if(!l&&r==1) dp[now][j][k]=(dp[now][j-1][k-A[j]+A[j-1]]+dp[now][j-1][k+A[j]])%mod;
else if(!l&&r==2) dp[now][j][k]=(dp[now][j-1][k-(A[j]<<1)]+dp[now][j-1][k-(A[j]<<1)+(A[j-1]<<1)])%mod;
else dp[now][j][k]=0;//注意清零
}else if(!l&&!r) dp[now][j][k]=dp[now][j-1][k];else dp[now][j][k]=0;//
}
}
printf("%d\n",dp[now][m][0]);
return 0;
}
[BZOJ2331]地板(插头DP)的更多相关文章
- [SCOI2011][bzoj2331] 地板 [插头dp]
题面: 传送门 思路: 插头dp基础教程 这个L形......第一眼看上去真的是丧病啊 但是仔细想想,实际上也就是拿一堆路径铺满一个棋盘,这个路径还是有限制的 那还有什么好说的,插头dp上啊[雾] 首 ...
- bzoj 2331: [SCOI2011]地板 插头DP
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
- 2331: [SCOI2011]地板 插头DP
国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...
- 【BZOJ】2331: [SCOI2011]地板 插头DP
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- BZOJ 2331 [SCOI2011]地板 ——插头DP
[题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...
- 【BZOJ2331】[SCOI2011]地板 插头DP
[BZOJ2331][SCOI2011]地板 Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里 ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...
- P3272 [SCOI2011]地板(插头DP)
[题面链接] https://www.luogu.org/problemnew/show/P3272 [题目描述] 有一个矩阵,有些点必须放,有些点不能放,用一些L型的图形放满,求方案数 [题解] ( ...
- 插头dp初探
问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...
随机推荐
- Golang: runnerw.exe: CreateProcess failed with error 216 (no message available)
话说这个我应该遇到几次了 每次新项目都有这问题,我的记忆是金鱼的记忆吗? 好在这次隐约记起是包名的问题... 方法 修改包名为main
- GitLab常用命令整理
进入本地仓库访问位置之后执行命令 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote ...
- MVC与MVVM的关系
什么是MVC? M(Model数据层) 职能单一,只负责操作数据库,执行对于的 Sql 语句,进行数据的CRUD C: create 增加 R: Read 读取 U: update 修改 D: Del ...
- 从零开始的全栈工程师——js篇2.13(案例存放:三重数组渲染)
- 用weex create 创建app项目 报 ERROR in index.web.js from UglifyJs 错误!
用weex create创建一个APP项目,安装依赖后运行报 这个是package.json index.web.js 在dist目录下是build时生成的. 上面的答案没有给大家细节,不好意思致歉下 ...
- 从github克隆内容到本地时权限问题
从github克隆内容到本地时权限问题
- Retrofit2与RxJava用法大全
Retrofit2是square公司出品的一个网络请求库,网上有很多相关的介绍.我很久以前都想去研究了,但一直都有各种事情耽搁,现在就让我们一起去捋一捋,这篇主要讲解Retrofit2与RxJava的 ...
- python字符串及字符串操作
字符串介绍 1.字符串在内存中的存储: 2.字符串相加: 3.字符串的格式化: In [1]: a = 100 In [2]: a Out[2]: 100 #100<255,在堆内存下占用了一个 ...
- LEMP (LNMP) Stack-5.4.16 (OpenLogic CentOS 7.2)
LEMP (LNMP) Stack-5.4.16 (OpenLogic CentOS 7.2) 平台: CentOS 类型: 虚拟机镜像 软件包: mariadb-5.5.47 nginx-1.6.3 ...
- w3cschool中jQuery测试结果总结
1.jQuery 是 W3C 标准. 2.$("div#intro .head") 选择器选取:class="intro" 的任何 div 元素中的首个 id= ...