Description

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

需要注意的是,L型地板的两端长度可以任意变化,但不能长度为0。铺设完成后,客厅里面所有没有柱子的地方都必须铺上地板,但同一个地方不能被铺多次。

R*C<=100

Solution

插头DP,用三进制表示状态,0表示无插头,1表示有插头且可以转向,2表示有插头但不可转向

转移如下,

  1. 00 To 22/10/01
  2. 11 To 00
  3. 10 To 20/01
  4. 20 To 00/02
  5. 01 To 10/02
  6. 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)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...

  8. P3272 [SCOI2011]地板(插头DP)

    [题面链接] https://www.luogu.org/problemnew/show/P3272 [题目描述] 有一个矩阵,有些点必须放,有些点不能放,用一些L型的图形放满,求方案数 [题解] ( ...

  9. 插头dp初探

    问题描述 插头dp用于解决一类可基于图连通性递推的问题.用插头来表示轮廓线上的连通性,然后根据连通性与下一位结合讨论进行转移. 表示连通性的方法 与字符串循环最小表示不同,这种方法用于给轮廓线上的联通 ...

随机推荐

  1. Reactor Pattern and Non-blocking IO--reference

    reference from:http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html ...

  2. &&运算符和||运算符的优先级问题 专题

    public class SyntaxTest { @Test public void test() { System.out.println(true || true && fals ...

  3. 从零开始的全栈工程师——js篇2.11(原型)

    原型 原型分析 1.每个 函数数据类型(普通函数,类)都有一个prototype属性 并且这个属性是一个对象数据类型2.每个Prototype上都有一个constructor属性 并且这个属性值是当前 ...

  4. CPU保护模式DPL、CPL简易理解

    现代INTEL CPU都有保护模式,实模式这两种CPU运行模式.当CPU加电,CPU初始化时就运行在是模式下,然后现代操作系统会从实模式跳转到保护模式! 为什么需要保护模式? 在最开始编程的汇编时代, ...

  5. Java Annotation使用详解

    Java  Annotation是JDK5.0引入的一种注释机制.它与注释有一定区别,可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取.执行相应的处理.通 ...

  6. I-129表

    http://www.uscis.gov/i-129 移民局使用的非移民性质的工作身份申请表(I-129)表格将于下月底正式作废,4月30日之后,公民和移民服务局只接受新的I-129表格. 据了解,非 ...

  7. DataView RowFilter

    DataView类用来表示定制的DataTable的视图. DataTable和DataView的关系是遵循著名的设计模式--文档/视图模式,其中DataTable是文档,而Dataview是视图. ...

  8. hdu1150&&POJ1325 Machine Schedule---最小点覆盖

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1150 题目大意: 给你两台机器A和B,A机器有n种模式,B机器有m种模式,初始时都是0,现在给你k个 ...

  9. Java反射得到属性的值和设置属性的值

    package com.whbs.bean; public class UserBean { private Integer id; private int age; private String n ...

  10. 使用vue-cli创建项目

    使用Vue UI创建.管理项目 1.全局安装vue-cli 3.0 npm install -g @vue/cli 2.启动vue ui 创建项目: vue ui