BZOJ 2331 地板
妈妈我会写插头dp了!!!!!!。。。。
感动啊。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 105
#define maxs 200000
#define mod 20110520
using namespace std;
int n,m,map[maxn][maxn],dp[][][maxs],tab[maxs][],table[];
int s1[maxn],s2[maxn],top=;
int pt[][];
char s[maxn];
void ex()
{
for (int i=;i<=n;i++)
for (int j=i+;j<=m;j++)
swap(map[i][j],map[j][i]);
swap(n,m);
}
void get_table()
{
table[]=;
for (int i=;i<=;i++) table[i]=table[i-]*;
for (int i=;i<;i++)
{
tab[i][]=tab[i-][]+;int flag=;
if (tab[i][]==) {flag=;tab[i][]=;}
for (int j=;j<=;j++)
{
tab[i][j]=tab[i-][j]+flag;
if (tab[i][j]==) {flag=;tab[i][j]=;}
else flag=;
}
}
int cnt=;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{cnt++;pt[cnt][]=i;pt[cnt][]=j;}
}
void modify(int x,int bs)
{
s1[]=bs;s2[]=pt[x][];s1[]=bs+;s2[]=pt[x][];
top=;
}
int find(int x)
{
int a[],data=;
for (int i=;i<=;i++) a[i]=tab[x][i];
for (int i=;i<=top;i++) a[s1[i]]=s2[i];
for (int i=;i>=;i--) data=data*+a[i];
return data;
}
void plug_dp()
{
dp[][m&][]=;
for (int i=;i<=n;i++)
{
memset(dp[i&],,sizeof(dp[i&]));
for (int j=;j<table[m];j++) dp[i&][][j*]=dp[(i&)^][m&][j];
for (int j=;j<=m;j++)
{
for (int k=;k<table[m+];k++) dp[i&][j&][k]=;
for (int k=;k<table[m+];k++)
{
if (map[i][j])
{
if ((tab[k][j-]==) && (tab[k][j]==))
{
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
//nothing here.
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
//nothing here.
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;
}
else if ((tab[k][j-]==) && (tab[k][j]==))
{
//nothing here.
}
else {modify(,j-);dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][find(k)])%mod;}
}
else
if ((tab[k][j-]==) && (tab[k][j]==))
dp[i&][j&][k]=(dp[i&][j&][k]+dp[i&][(j&)^][k])%mod;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%s",s);
for (int j=;j<=m;j++)
{
if (s[j-]=='_') map[i][j]=;
else map[i][j]=;
}
}
if (n<m) ex();
get_table();
plug_dp();
printf("%d\n",dp[n&][m&][]);
return ;
}
BZOJ 2331 地板的更多相关文章
- bzoj 2331: [SCOI2011]地板 插头DP
2331: [SCOI2011]地板 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 541 Solved: 239[Submit][Status] D ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- BZOJ 2331 [SCOI2011]地板 ——插头DP
[题目分析] 经典题目,插头DP. switch 套 switch 代码瞬间清爽了. [代码] #include <cstdio> #include <cstring> #in ...
- bzoj 2331: [SCOI2011]地板【插头dp】
一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样 ...
- 插头DP学习笔记——从入门到……????
我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...
- 【BZOJ】2331: [SCOI2011]地板
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...
- 【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表示有一个必须延伸至少一格且拐弯的插头, ...
随机推荐
- nodeschool.io 2
~~ BABY STEPS ~~ Write a program that accepts one or more numbers as command-line arguments and pr ...
- JavaScript实现冒泡排序
思想:从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,一个最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置.n个数, ...
- jdbc 配置properties实现
package com.web.study; import java.io.InputStream; import java.sql.Connection; import java.sql.Drive ...
- JAVA读取EXCEL文件异常Unable to recognize OLE stream
异常: jxl.read.biff.BiffException: Unable to recognize OLE stream at jxl.read.biff.CompoundFile.<in ...
- python与字符集编码
讲的比较明白的博客:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 以上面博文的汉为例子,汉字的GBK编码是baba, UNIC ...
- BZOJ1727 [Usaco2006 Open]The Milk Queue 挤奶队列
贪心...我怎么不会QAQ[捂脸熊] 对于1.2两头牛,如果1号牛要排在2号牛前面才能时间更少,则 $$max(A_1 + B_1 + B_2, \ A_1 + A_2 + B_2) \le max( ...
- BZOJ1218 [HNOI2003]激光炸弹
题目后面写着DP就当它是DP吧.. 本来是扫描线+线段树的说,但是捏5000^2还是能过滴,于是暴力枚举正方形+所谓的DP就解决了. /******************************** ...
- DOM系列---基础篇[转]
DOM (Document Object Model) 即文档对象模型, 针对 HTML 和 XML 文档的 API (应用程序接口) .DOM 描绘了一个层次化的节点树,运行开发人员添加.移除和修改 ...
- kindeditor 操作时同步到textarea
KindEditor.ready(function(K) { editor1 = K.create('textarea[name="sponsor"]', { resizeType ...
- 1800: [Ahoi2009]fly 飞行棋
#include<cstdio> #include<iostream> using namespace std; ],n,ans; int main() { scanf(&qu ...