昨晚想了好久还是不是会压睡了一觉yy了一下突然会了
我也不知道这个叫不叫插头dp,毕竟没写过…
不过跑的很快快(自我满足一下qwq)

首先因为nm<=100,min(n,m)<=10,n>m时旋一下
考虑轮廓线dp,3进制状态
0表示:这样一个陷下去的轮廓线
1表示:这样一个由上面的倒L(可能是朝左也可能朝右)留下来的一个突出
2表示:这样一种最正常的,上面刚好填充完的轮廓
转移时,对于四种L,我们分别在下图的红圈位置转移他
1:
2:
3:
4:
用这个三进制表示是可以顺利转移的具体我就懒得讲了qwq
注意因为我奇怪的转移方式fi,j,k->fi,l,k(l=j+1 to m),这题不能一格一格滚动否则会覆盖掉一些状态,我是按照一行一行滚动的

复杂度O(nm∗3min(n,m))O(nm*3^{min(n,m)})

code:

#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;const int maxn = 105;
const int mask = 61000;
const int mod = 20110520;
inline void add(int &a,const int &b){a+=b;if(a>=mod)a-=mod;}int pw[11];int n,m;
bool v[maxn][maxn];
char str[maxn];
int f[11][mask];int dp()
{int al=pw[m]; f[m][al-1]=1;for(int i=1;i<=n;i++){for(int k=0;k<al;k++) if(f[m][k]){int &temp=f[m][k];add(f[0][k],temp);temp=0;}for(int j=1,las=0;j<=m;j++,las++){for(int k=0;k<al;k++) if(f[las][k]){int &temp=f[las][k];int l=k/pw[j-1]%3;if(v[i][j]){if(l==2) add(f[j][k],temp);}else{if(!l){add(f[j][k],temp);int nk=k+pw[j-1]*2;for(int nex=j+1;nex<=m&&!v[i][nex];nex++){int knex=k/pw[nex-1]%3;if(knex!=2) break;add(f[nex][nk],temp);}}else if(l==1){add(f[j][k],temp);add(f[j][k+pw[j-1]],temp);}else{add(f[j][k-pw[j-1]*2],temp);int nk=k-pw[j-1];for(int nex=j+1;nex<=m&&!v[i][nex];nex++){int knex=k/pw[nex-1]%3;if(knex!=2) break;add(f[nex][nk],temp);}for(int nex=j+1;nex<=m&&!v[i][nex];nex++){int knex=k/pw[nex-1]%3;if(knex!=2) break;add(f[nex][k-pw[nex-1]],temp);}for(int nex=j+1;nex<=m&&!v[i][nex];nex++){int knex=k/pw[nex-1]%3;if(knex==1) break;if(knex==0){add(f[nex][k+pw[nex-1]*2],temp);break;}}}}temp=0;}}}int re=0;for(int k=0;k<al;k++) if(f[m][k]){int sig=1;for(int j=1;j<=m;j++)if(k/pw[j-1]%3!=2) { sig=0;break; }add(re,sig*f[m][k]);}return re;
}int main()
{pw[0]=1; for(int i=1;i<11;i++) pw[i]=pw[i-1]*3;scanf("%d%d",&n,&m);if(n<m){for(int i=1;i<=n;i++){scanf("%s",str+1);for(int j=1;j<=m;j++) v[j][n-i+1]=str[j]=='*';}swap(n,m);}else{for(int i=1;i<=n;i++){scanf("%s",str+1);for(int j=1;j<=m;j++) v[i][j]=str[j]=='*';}}if(m==1) return puts("0"),0;printf("%d\n",dp());return 0;
}

BZOJ2331: [SCOI2011]地板相关推荐

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

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2331 [题解] 可以用插头dp的方式表示状态. 每一位用一个三进制位表示,0表示没有 ...

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

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

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

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

  4. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

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

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

  6. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  7. 【水】【SCOI】 精简题解

    第二弹 [SCOI2009]生日快乐 搜索.递归划分问题. [SCOI2009]游戏 记忆化搜索.枚举素因子,DP. [SCOI2009]windy数 数位DP,分块统计. [SCOI2009]最长距 ...

  8. 【SCOI2011】bzoj2331 地板

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

  9. [BZOJ2331]地板(插头DP)

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

最新文章

  1. 微软开源 Malmo AI 平台,构建复杂机器人任务
  2. 【 MATLAB 】用 MATLAB 实现离散时间傅里叶变换(DTFT)的两个案例分析
  3. 使用sql语句,查询 mysql 的安装地址
  4. 没有一部是烂片 香港最强水准的10部影片
  5. ITK:更改图像原点间距或方向
  6. python爬取网页防止重复内容_python解决网站的反爬虫策略总结
  7. SQL Server 涉及数据库安全常用SQL语句
  8. 该服务器支持最多2100个参数,Mybatis批量查询拼装参数超长的解决办法
  9. cad填充图案乱理石_CAD绘图,缺少填充图案怎么办?900多种自定义图案可解燃眉之急...
  10. html网页布局对联,html javascript 网站两侧对联广告
  11. redhat-5.4故障排除
  12. 机器学习(3)——K-近邻算法改进约会网站的配对效果实例
  13. VMware Workstation 14 Pro 安装 Windows Server 2003(完)
  14. Json转对象 调用toBean
  15. SPDY协议 - v3
  16. 单个Java文件打成可执行JAR包
  17. vr全景图片制作方法
  18. Java编程那些事儿70——抽象类和接口(三)
  19. python----下载安装
  20. nvidia-smi卡顿详解

热门文章

  1. vue css引用图片编译后路径出错
  2. PNAS:婴儿早期的大脑功能灵活性
  3. NOI 3.4 队列 2729:Blah数集(单调队列)
  4. linux 5353端口禁止,系统运维|解决DNS污染与劫持之使用特殊DNS端口
  5. Java原型模式(prototype)
  6. DenseNet - 稠密神经网络(CNN卷积神经网络)
  7. Robot Framework(RF)语法与运用初识
  8. excel表格打印每页都有表头_Excel表格技巧—解决打印没有表格线的问题
  9. VS 光标变成方块
  10. eclipse光标变成黑色闪烁方块解决方案