HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定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+状压容斥的更多相关文章
- 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 ...
- 洛谷 P3343 - [ZJOI2015]地震后的幻想乡(朴素状压 DP/状压 DP+微积分)
题面传送门 鸽子 tzc 竟然来补题解了,奇迹奇迹( 神仙题 %%%%%%%%%%%% 解法 1: 首先一件很明显的事情是这个最小值可以通过类似 Kruskal 求最小生成树的方法求得.我们将所有边按 ...
- Solid Dominoes Tilings (轮廓线dp打表 + 容器)
第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表 #include<bits/stdc++.h> using namespace std; ; <<; ...
- UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/problem/214 题目大意: 请自行阅读. 题解: 官方题解讲得相 ...
- codeforces 597div2 F. Daniel and Spring Cleaning(数位dp+二维容斥)
题目链接:https://codeforces.com/contest/1245/problem/F 题意:给定一个区间(L,R),a.b两个数都是属于区间内的数,求满足 a + b = a ^ b ...
- 消失之物(背包DP)(容斥或分治)
容斥做法: 首先n^2搞出f[i][j]第i个物品,j体积的方案数. 去除每个物品贡献: 设个g[i][j]表示当i不选,j体积方案数(注意不是此时的范围相对于全局,而不是1---i) 那么我们用到一 ...
- 洛谷P4707 重返现世 [DP,min-max容斥]
传送门 前置知识 做这题前,您需要认识这个式子: \[ kthmax(S)=\sum_{\varnothing\neq T\subseteq S}{|T|-1\choose k-1} (-1)^{|T ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
随机推荐
- hdu 4038 Stone
思路: 如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正: 对于正数,尽量将1,2变为3即可. 代码如下: #include<cstring> #include<iostre ...
- http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)
http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html
- lintcode 中等题:subsets II 带重复元素的子集
题目 带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2] ...
- [SharePoint 2013 入门教程 3 ] 排版第一个网站集,网站
我们创建了一个TEST网站集,如果你觉得太丑,怎么办,我们一起来给它整整容吧. 点击页面--> 编辑页面 我们现在就可以在页面上添加各种部件,进行布局排版.
- cv论文(SPARSE REPRESENTATION相关)
上个博文我讲了一些CNN相关的论文,比较浅显都是入门知识,这节课来总结一些稀疏表示方面的文章.至于上个博文说到的要讲的sparse coding的知识,我将会放在Deep Learning的专题里面讲 ...
- C++:常类型Const
常类型:使用类型修饰符const说明的类型,常类型的变量或对象成员的值在程序运行期间是不可改变的. 3.10.1 常引用 如果在说明引用时用const修饰,则被说明的引用为常引用.如果用常引用做形参, ...
- C++:对象指针
对象指针概念:每一个对象在初始化后都会在内存中占有一定的空间.因此,既可以通过对象名访问, 也可以通过一个对象地址来访问一个对象.对象指针就是用于存放对象地址的变量. 声明对象指针的一般语法格式为:类 ...
- mysql优化 mysql explain
一篇文章: 使用use index优化sql查询 先看一下arena_match_index的表结构,大家注意表的索引结构CREATE TABLE `arena_match_index` ( ` ...
- js问题总结
.removeClass(" ") 移除一个css样式 $("#popUpBox i").removeClass("channel_icon" ...
- android系统中使用TelephonyManager类来获取imei号和其他手机信息
在AndroidManifest.xml文件中增加<!--允许读取电话状态SIM的权限--><uses-permission android:name="android.p ...