妈妈我会写插头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. (19)odoo中的javascript

    -----------更新日期15:17 2016-02-16 星期二-----------* 用到的js库   我们可以打开 addons/web/views/webclient_template. ...

  2. WPF:xmal 静动态资源

    <StackPanel.Resources> <SolidColorBrush x:Key="myBrush" Color="Teal"/&g ...

  3. 3D旋转动画

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  4. 修改WAMPServer中MySql中文乱码的方法

    修改MySql的配置文件my.ini,在[client]段落增加:default-character-set=utf8;在[mysqld]段落增加:character_set_server=utf8; ...

  5. JVM优化之调整大内存分页(LargePage)

    转自:http://cjjwzs.iteye.com/blog/1059381 本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的性能有何提升作用,并在文末点明了大 ...

  6. checkbox改成radio效果,单选,取消

    $(function () {            var allBox = $(":checkbox");            allBox.click(function ( ...

  7. 简单分析Java的HashMap.entrySet()的实现

    关于Java的HashMap.entrySet(),文档是这样描述的:这个方法返回一个Set,这个Set是HashMap的视图,对Map的操作会在Set上反映出来,反过来也是.原文是 Returns ...

  8. MyEclipse10.X 的破解过程详细图解

    http://wenku.baidu.com/view/423e95056c85ec3a87c2c512.html

  9. java面向对象编程——第五章 对象的行为

    5.1 方法调用栈 当一个方法被调用时,将导致控制流程跳转到被调用的方法.然后,控制流程执行方法中的语句.当然,被执行的方法可能会调用其它方法,导致控制流程跳转到其它方法.所有的方法调用都维护在一个称 ...

  10. sql 如何过滤重复记录

    distinct : select distinct ID from table1