妈妈我会写插头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 地板的更多相关文章

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

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

  2. bzoj:2331: [SCOI2011]地板

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

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

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

  4. bzoj 2331: [SCOI2011]地板【插头dp】

    一开始设计了四种状态,多了一种已经拐弯但是长度为0的情况,后来发现不用,设012表示没插头,没拐弯的插头,拐了弯的插头,然后转移的话12,21,22都不合法,剩下的转移脑补一下即可,ans只能在11, ...

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

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

  6. 插头DP学习笔记——从入门到……????

    我们今天来学习插头DP??? BZOJ 2595:[Wc2008]游览计划 Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该 ...

  7. 【BZOJ】2331: [SCOI2011]地板

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2331 一眼插头DP... 考虑一个L形的东西,要构成它可以划分为两个阶段,即当前线段是拐了 ...

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

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

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

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

随机推荐

  1. js中tagName和nodeName

    DOM里常见的三种节点类型(总共有12种,如docment):元素节点,属性节点以及文本节点,例如<h2 class="title">head</h2>,其 ...

  2. (09)odoo工作流

    --------------修订时间14:54 2016-09-18 星期日21:59 2016-06-12 星期日10:06 2016-02-24 星期三17:14 2016-01-29 星期五-- ...

  3. 多条查询sql语句返回多表数据集

    + + "';SELECT ProductID,ProductTitle,ProductName,SalePrice,ListingPrice,MainPicture,SaledItemCo ...

  4. java中汉字自动转换成拼音

    java中汉字自动转换成拼音 1.需要下载jar包 pinyin4j.2.5.0.jar ,加入到WEB-INF下的lib里边,右键add to bulid path. 2.[代码]PinYinUti ...

  5. CSS3发光字动画

    ;} img{ width:200px; height:200px; border:2px solid #000} .back h5 { font-size: 4em; color: #f2050b; ...

  6. javascript 把字符串转换为对象

    function strToJson(str) { var json = (new Function("return " + str))(); return json;}

  7. ACTIVITI 研究代码 之 模版模式

    模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤.代表这些具体逻辑步骤的方法称做基本方法(primitive ...

  8. 使用WebView视图显示网页-----迷你浏览器

    Android提供了WebView组件,表面上来看,这个组件与普通ImageView差不多,但实际上,这个组件的功能要强大得多,WebView组件本身就是一个浏览器实现,它的内核基于开源WebKit引 ...

  9. 第48套题【tarjan】【图&树的连通性】【并查集】

    Problem 1 图的连通性

  10. WP8 学习 在APP.XAML中加入Resources

    <Application.Resources> <local:LocalizedStrings xmlns:local="clr-namespace:test1" ...