博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2331:[SCOI2011]地板——题解
阅读量:6503 次
发布时间:2019-06-24

本文共 2395 字,大约阅读时间需要 7 分钟。

题面复制于洛谷

题目描述

lxhgww的小名叫”小L“,这是因为他总是很喜欢L型的东西。小L家的客厅是一个R*C的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板。现在小L想知道,用L型的地板铺满整个客厅有多少种不同的方案?需要注意的是,如下图所示,L型地板的两端长度可以任意变化,但不能长度为0。

 

铺设完成后,客厅里面所有没有柱子的地方都必须铺上地板,但同一个地方不能被铺多次。

输入输出格式

输入格式:

输入的第一行包含两个整数,R和C,表示客厅的大小。接着是R行,每行C个字符。'_'表示对应的位置是空的,必须铺地板;'*'表示对应的位置有柱子,不能铺地板。

输出格式:

输出一行,包含一个整数,表示铺满整个客厅的方案数。由于这个数可能很大,只需输出它除以20110520的余数。

输入输出样例

输入样例#1: 
2 2*___
输出样例#1: 
1
输入样例#2: 
3 3___ _*____
输出样例#2: 
8

参考了:

我终于可以告别插头dp啦233333……<—此人已疯

这道题的难点在于将插头dp的插头的定义进行修改。

0:无插头

1:有插头且当前格子所在的地板能再转弯。

2:有插头且当前格子所在的地板不能再转弯。

 有了这些就可以按照插头dp的思想进行分情况讨论了:

(摘自参考博客)

1.00-->22 或 10 或 01

2.11-->00

3.10-->20 或 01

   20-->00 或 02

4.01-->10 或 02

   02-->00 或 20

 最终把所有情况枚举累加即可。

PS:第二种情况的11转换成了00实质上是11相交的地方变成了这块地板的转折点(也可以理解为两块地板并在了一起)。

#include
#include
#include
using namespace std;typedef long long ll;const int INF=2147483647;const int mod=300000;const int M=1000005;const int p=20110520;struct node{ int to,nxt;}edge[M];int head[M],cnt;int n,m;bool mp[105][105];int cur,pre;int state[2][M];ll ans[2][M],cntt;int tot[2];int bit[15];inline void getbit(){ for(int i=1;i<15;i++)bit[i]=i<<1; return;}inline void add(int u,int v){ cnt++; edge[cnt].to=v; edge[cnt].nxt=head[u]; head[u]=cnt; return;}void insert(int now,ll num){ int u=now%mod; for(int i=head[u];i;i=edge[i].nxt){ int v=edge[i].to; if(state[cur][v]==now){ ans[cur][v]+=num%p; ans[cur][v]%=p; return; } } add(u,++tot[cur]); state[cur][tot[cur]]=now; ans[cur][tot[cur]]=num%p; return;}void plugdp(){ cur=0; tot[cur]=1; ans[cur][1]=1; state[cur][1]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=tot[cur];j++){ state[cur][j]<<=2; } for(int j=1;j<=m;j++){ memset(head,0,sizeof(head));cnt=0; pre=cur,cur^=1; tot[cur]=0; for(int k=1;k<=tot[pre];k++){ int now=state[pre][k]; ll num=ans[pre][k]%p; int is_down=(now>>bit[j-1])%4; int is_right=(now>>bit[j])%4; if(!mp[i][j]){ if(!is_down&&!is_right) insert(now,num); } else if(!is_down&&!is_right){ if(mp[i+1][j]) insert(now+(1<

转载于:https://www.cnblogs.com/luyouqi233/p/8261279.html

你可能感兴趣的文章
python之CSV文件格式
查看>>
你必须知道的.net学习总结
查看>>
leetcode之Reorder List
查看>>
Axure8.0 网页 or App 鼠标滚动效果
查看>>
文件操作示例脚本 tcl
查看>>
大家好,新年快乐。
查看>>
prototype
查看>>
Android学习路线
查看>>
Linux下的redis的持久化,主从同步及哨兵
查看>>
在相同的主机上创建一个duplicate数据库
查看>>
Date15
查看>>
从Date类型转为中文字符串
查看>>
基于multisim的fm调制解调_苹果开始自研蜂窝网调制解调器 最快2024年能用上?
查看>>
mupdf不支持x64_Window权限维持(七):安全支持提供者
查看>>
cf修改游戏客户端是什么意思_瓦罗兰特很有可能取代cf成为国内最火的fps游戏...
查看>>
proto文件支持继承吗_JavaScript继承(一)——原型链
查看>>
labview如何弹出提示窗口_LabVIEW开发者必读的问答汇总,搞定疑难杂症全靠它了!...
查看>>
提取series中的数值_Python中None和numpy.nan的区别
查看>>
hikariconfig mysql_HikariConfig配置解析
查看>>
mysql批量数据多次查询数据库_mysql数据库批量操作
查看>>