BZOJ 2331 [SCOI2011]地板 ——插头DP
【题目分析】
经典题目,插头DP。
switch 套 switch 代码瞬间清爽了。
【代码】
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define F(i,j,k) for (int i=j;i<=k;++i)
- #define D(i,j,k) for (int i=j;i>=k;--i)
- #define maxn 400005
- const int md=20110520;
- int dp[2][maxn],a[101][101],n,m,fac[15],tot,b[15];
- char s[105];
- void print(int x){F(i,0,m) printf("%d",(x%fac[i+1])/fac[i]);}
- int main()
- {
- scanf("%d%d",&n,&m);
- F(i,0,n-1){scanf("%s",s);F(j,0,m-1)a[i][j]=s[j]=='*'?1:0;}
- if (m>n){F(i,0,m-1)F(j,i+1,m-1)swap(a[i][j],a[j][i]);swap(m,n);}
- // F(i,0,n-1){F(j,0,m-1)printf("%d ",a[i][j]);printf("\n");}
- fac[0]=1;F(i,1,13)fac[i]=fac[i-1]*3;tot=fac[m+1]-1;
- int now=1,pre=0;
- memset(dp[now],0,sizeof dp[now]);
- dp[now][0]=1;
- F(i,0,n-1) F(j,0,m-1)
- {
- if (a[i][j])
- {
- now^=1;pre^=1;
- memset(dp[now],0,sizeof dp[now]);
- F(s,0,tot) if (dp[pre][s])
- {
- // printf("now is "); print(s); printf(" \n");
- int tmp1=(s%fac[j+1])/fac[j],tmp2=(s%fac[j+2])/fac[j+1],tmp=s;
- if (!tmp1&&!tmp2)
- {
- (dp[now][s]+=dp[pre][s])%=md;
- // printf(" to "); print(s); printf("\n");
- }
- }
- }
- else
- {
- now^=1;pre^=1;
- memset(dp[now],0,sizeof dp[now]);
- F(s,0,tot) if (dp[pre][s])
- {
- // printf("now is "); print(s); printf(" \n");
- int tmp1=(s%fac[j+1])/fac[j],tmp2=(s%fac[j+2])/fac[j+1],tmp=s;
- switch(tmp1)
- {
- case 0:
- switch(tmp2)
- {
- case 0:
- tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
- // printf(" to "); print(tmp+2*fac[j]+2*fac[j+1]); printf("\n");
- (dp[now][tmp+2*fac[j]+2*fac[j+1]]+=dp[pre][s])%=md;
- // printf(" to "); print(tmp+fac[j]); printf("\n");
- (dp[now][tmp+fac[j]]+=dp[pre][s])%=md;
- // printf(" to "); print(tmp+fac[j+1]); printf("\n");
- (dp[now][tmp+fac[j+1]]+=dp[pre][s])%=md;
- break;
- case 1:
- tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
- // printf(" to "); print(tmp+fac[j]); printf("\n");
- (dp[now][tmp+fac[j]]+=dp[pre][s])%=md;
- // printf(" to "); print(tmp+2*fac[j+1]); printf("\n");
- (dp[now][tmp+2*fac[j+1]]+=dp[pre][s])%=md;
- break;
- case 2:
- tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
- // printf(" to "); print(tmp); printf("\n");
- (dp[now][tmp]+=dp[pre][s])%=md;
- // printf(" to "); print(tmp+2*fac[j]); printf("\n");
- (dp[now][tmp+2*fac[j]]+=dp[pre][s])%=md;
- break;
- }
- break;
- case 1:
- switch(tmp2)
- {
- case 0:
- tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
- // printf(" to "); print(tmp+2*fac[j]); printf("\n");
- (dp[now][tmp+2*fac[j]]+=dp[pre][s])%=md;
- // printf(" to "); print(tmp+fac[j+1]); printf("\n");
- (dp[now][tmp+fac[j+1]]+=dp[pre][s])%=md;
- break;
- case 1:
- tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
- // printf(" to "); print(tmp); printf("\n");
- (dp[now][tmp]+=dp[pre][s])%=md;
- break;
- case 2:
- break;
- }
- break;
- case 2:
- switch(tmp2)
- {
- case 0:
- tmp-=tmp1*fac[j]; tmp-=tmp2*fac[j+1];
- // printf(" to "); print(tmp+2*fac[j]); printf("\n");
- (dp[now][tmp+2*fac[j+1]]+=dp[pre][s])%=md;
- // printf(" to "); print(tmp); printf("\n");
- (dp[now][tmp]+=dp[pre][s])%=md;
- break;
- case 1:
- break;
- case 2:
- break;
- }
- break;
- }
- }
- }
- if (j==m-1)
- {
- // printf("On The last of road\n");
- now^=1;pre^=1;
- memset(dp[now],0,sizeof dp[now]);
- F(s,0,tot) if (dp[pre][s])
- {
- // printf("End with "); print(s);
- int tmp=s,tmp1=(s%fac[m+1])/fac[m];
- if (tmp1) {continue;}
- tmp*=3;
- // printf(" can become "); print(tmp); printf("\n");
- (dp[now][tmp]+=dp[pre][s])%=md;
- }
- }
- }
- printf("%d\n",dp[now][0]);
- }
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
[题意]给定n*m的地板,有一些障碍格,要求用L型的方块不重不漏填满的方案数.L型方块是从一个方格向任意两个相邻方向延伸的方块,不能不延伸.n*m<=100. [算法]插头DP [题解]状态0表 ...
- 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\)表示是 ...
随机推荐
- UIView和Masonry实现动画效果
Masonry 实现动画效果如下: //button点击方法 - (void)clickedButton { static BOOL isMove; //默认是NO Weakify(weakSelf) ...
- Git .gitignore 设置为全局global
在操作Git时,我们会将修改的内容$git add . 到Git,Git会提示我们哪些文件都修改了.此时提示中会包括系统自动修改的文件,bin文件等.而我们add到Git时,并不希望将这些文件也一同a ...
- 利用UnblockNeteaseMusic实现网易云破版权,并实现shell可快速访问
注:本篇包含mac及windows下安装方式详细 mac安装 前提:安装有node环境,可参考 mac下安装nodejs 安装 下载git代码到本地 git clone https://github. ...
- Windows定时任务管理以及服务管理
1.NSSM.exe https://nssm.cc/ 2.Topshelf 引用地址:https://www.cnblogs.com/guogangj/p/10093102.html#4136330
- UVA 1151 Buy or Build (最小生成树)
先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...
- couldn't be opened because you don't have permission to view it” 解决方法
I use Xcode6 GM. I encountered the same problem. What I did was to go to Build Options. Then I chang ...
- 关于回顾css发现的一些问题
1.针对于before和after伪元素的用法: <style> .clearfix:before, .clearfix:after{ clear:both; content:" ...
- 第2节 azkaban调度:17、azkaban的两个服务模式的安装
2.3.3.azkaban两个服务模式安装 1.确认所需软件: Azkaban Web服务安装包 azkaban-web-server-0.1.0-SNAPSHOT.tar.gz Azkaban执行服 ...
- go get 升级所有
go get -u all go get -u go mod update go get -u full_package_name go get -u github.com/... // ('. ...
- Hibernate映射文件配置(hbm.xml和注解方式)
一:通过*.hbm.xml配置实体的实现方式 mappingResources用于指定少量的hibernate配置文件像这样 Xml代码 <property name="mappin ...