题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌

分析:第一步:

如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖

hihocoder有全套课程:骨牌覆盖(一, 二,三),状态压缩(二)

学好了以后,首先打一个预处理没有限制的表,由于赛后补题,我就没自己打,直接从网上粘的表

我的表来自:http://blog.csdn.net/u012015746/article/details/51971977

第二步:

这就是容斥的过程了,我们可以枚举每种列分割状态,计算出每种列分割状态下行合法的方案数

然后用总数,减去一个列分割数为1的,加上列分割数为2.........这就是容斥的过程了

细节处理:每种列状态下如何求合法的行状态呢,每种状态在用一下递推一下就好了(枚举依据是前j行无行分割,后i-j行有行分割)

其实是枚举的第一个行分割线出现的位置,上面不能有,下面就可以随意了

详情请参考上面的链接

复杂度:O(T*(n^2)*(2^m)),大概是这个复杂度

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL mod = 1e9+;
LL RES[][];
void init();
LL dp[];
LL solve(int n,int m){
int pos[],tot=(<<(m-));
LL ret=;
for(int cur=;cur<tot;++cur){
int cnt=;pos[cnt]=;
for(int i=;i<m-;++i)if(cur&(<<i))pos[++cnt]=i+;
pos[++cnt]=m;
for(int i=cnt;i>;--i)pos[i]-=pos[i-];
for(int i=;i<=n;++i){
for(int j=;j<i;++j){
LL tmp=;
for(int k=;k<=cnt;++k)
tmp=tmp*RES[i-j][pos[k]]%mod;
if(!j)dp[i]=tmp;
else dp[i]=(dp[i]-tmp*dp[j]%mod+mod)%mod;
}
}
if(cnt&)ret=(ret-dp[n]+mod)%mod;
else ret=(ret+dp[n])%mod;
}
return ret;
}
int main(){
init();
int n,m;
while(~scanf("%d%d",&n,&m)){
printf("%I64d\n",solve(n,m));
}
return ;
}
void init()
{
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
RES[][] = ;
}

HDU5731 Solid Dominoes Tilings 状压dp+状压容斥的更多相关文章

  1. 2016 Multi-University Training Contest 1 I. Solid Dominoes Tilings

    Solid Dominoes Tilings Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  2. 洛谷 P3343 - [ZJOI2015]地震后的幻想乡(朴素状压 DP/状压 DP+微积分)

    题面传送门 鸽子 tzc 竟然来补题解了,奇迹奇迹( 神仙题 %%%%%%%%%%%% 解法 1: 首先一件很明显的事情是这个最小值可以通过类似 Kruskal 求最小生成树的方法求得.我们将所有边按 ...

  3. Solid Dominoes Tilings (轮廓线dp打表 + 容器)

    第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表 #include<bits/stdc++.h> using namespace std; ; <<; ...

  4. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...

  5. codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)

    题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...

  6. 消失之物(背包DP)(容斥或分治)

    容斥做法: 首先n^2搞出f[i][j]第i个物品,j体积的方案数. 去除每个物品贡献: 设个g[i][j]表示当i不选,j体积方案数(注意不是此时的范围相对于全局,而不是1---i) 那么我们用到一 ...

  7. 洛谷P4707 重返现世 [DP,min-max容斥]

    传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...

  8. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  9. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

随机推荐

  1. Oracle 6 - 锁和闩 - transaction的可串行化

    本文主要内容 1.transaction的可串行化 2.数据库并发带来的问题, dirty read, Nonrepeatable reads, Phantoms幻读 3.隔离级别和2中的问题 4. ...

  2. Eclipse 编译错误 Access restriction:The type *** is not accessible due to restriction on... 解决方案

    报错: Access restriction:The type JPEGCodec is not accessible due to restriction on required library C ...

  3. BZOJ 3198 SDOI2013 spring

    为什么SDOI省选一年考两次容斥原理? 我们很容易发现>=k个相等时很好计算的 但是我们要求恰好k个,那么我们容斥即可 至于计算>=k个相等,首先我们枚举相等位置,对每个串对应位置做一遍h ...

  4. java:异常处理

    异常:编译正常,但运行出错,会中断正常指令流 RuntimeException:运行时异常 分为:uncheck exception.和check exception(除了RuntimeExcepti ...

  5. 在浏览器控制台输出内容 console.log(string);

    在浏览器控制台中写如数据 1添加    <script type="text/javascript">djConfig = { isDebug: true };< ...

  6. 01-语言入门-01-A+B Problem

    题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=1    描述 此题为练手用题,请大家计算一下a+b的值   输入 输入两个数,a,b 输 ...

  7. ConcurrentDictionary和Dictionary

    http://stackoverflow.com/questions/6739193/is-the-concurrentdictionary-thread-safe-to-the-point-that ...

  8. 面向对象设计Object Oriented Design

    http://www.codeproject.com/Articles/93369/How-I-explained-OOD-to-my-wife http://www.cnblogs.com/niyw ...

  9. vi 编辑内容中查找字符位置

    [root@localhost gdm]# vi /etc/X11/gdm/gdm.conf # You can also use the gdm-restart and gdm-safe-resta ...

  10. mac 下php运行bug

    如下所说bug在window下没有,在mac下存在. mac下的php报如下错误: fopen("data.json") Error: failed to open stream: ...