第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表
#include<bits/stdc++.h>
using namespace std; const int mod = 1e9 + ;
const int maxn = <<;
int dp[][maxn + ];
int ans[][]; int solve(int n, int m){
if(n * m % == ) return ;
memset(dp, , sizeof(dp));
dp[][] = ;
int ing = , ed = ;
for(int i = ; i < n; i ++){
for(int j = ; j < m; j ++){
swap(ing, ed);
memset(dp[ing], , sizeof(dp[ing]));
for(int sta = ; sta < (<<m); sta ++){
if(sta & (<<j)) dp[ing][sta&(~(<<j))] = (dp[ing][sta&(~(<<j))] + dp[ed][sta]) % mod;//无添加
if((sta & (<<j)) == ) dp[ing][sta | (<<j)] = (dp[ing][sta | (<<j)] + dp[ed][sta]) % mod;//加上2*1(竖放)
if(((sta & (<<j)) == ) && (j != m - )) dp[ing][sta | (<<(j+))] = (dp[ing][sta | (<<(j+))] + dp[ed][sta]) % mod;//加上1*2(横放)
}
}
}
return dp[ing][];
} int main(){
freopen("data.txt", "w", stdout);
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
ans[i][j] = solve(i, j);
for(int i = 0; i < ; i ++){
for(int j = 0; j < ; j ++)printf("%d, ",ans[i][j]);
}
return ;
}
然后用容器原理加上枚举列当前分界线情况去递推容斥。具体如代码:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL mod=1e9+; LL dp[][]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
LL f[];
int b[],cnt,siz,n,m;
LL solve(int n,int m){
LL ret = ;
for(int sta = ; sta < ( << (m - )); sta ++){
int cnt = , len = ;
for(int i = ; i < m - ; i ++){
len ++;
if(sta >> i & ){
b[cnt ++] = len;
len = ;
}
}
b[cnt ++] = ++len; for(int i = ; i <= n; i ++){
for(int j = ; j < i; j ++){
LL temp = ;
for(int k = ; k < cnt; k ++)
temp = temp * dp[b[k]][i - j] % mod;
if(!j) f[i] = temp;
else f[i] = ( (f[i] - f[j] * temp % mod) % mod + mod ) % mod;
}
}
if(!(cnt&)) ret = ( (ret - f[n]) % mod + mod ) % mod;
else ret = (ret + f[n]) % mod;
}
return ret;
}
int main(){
while(~scanf("%d%d",&n,&m)) printf("%lld\n",solve(n,m));
return ;
}
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 ...
-
HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
-
HDU1565 方格取数 &;&;uva 11270 轮廓线DP
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
-
POJ 3254 Corn Fields (状压DP,轮廓线DP)
题意: 有一个n*m的矩阵(0<n,m<=12),有部分的格子可种草,有部分不可种,问有多少种不同的种草方案(完全不种也可以算1种,对答案取模后输出)? 思路: 明显的状压DP啦,只是怎样 ...
-
【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)
Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...
-
Mondriaan&#39;s Dream 轮廓线DP 状压
Mondriaan's Dream 题目链接 Problem Description Squares and rectangles fascinated the famous Dutch painte ...
-
poj2411 Mondriaan&#39;s Dream (轮廓线dp、状压dp)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17203 Accepted: 991 ...
-
轮廓线DP POJ3254 &;&; BZOJ 1087
补了一发轮廓线DP,发现完全没有必要从右往左设置状态,自然一点: 5 6 7 8 9 1 2 3 4 如此设置轮廓线标号,转移的时候直接把当前j位改成0或者1就行了.注意多记录些信息对简化代码是很有帮 ...
-
HDU4804 Campus Design 轮廓线dp
跟上面那篇轮廓线dp是一样的,但是多了两个条件,一个是在原图上可能有些点是不能放的(即障碍),所以转移的时候要多一个判断color[i][j]是不是等于1什么的,另外一个是我们可以有多的1*1的骨牌, ...
随机推荐
-
Bootstrap_列表组
一.基本列表组 列表组是Bootstrap框架新增的一个组件,可以用来制作列表清单.垂直导航等效果,也可以配合其他的组件制作出更漂亮的组件. <ul class="list-grou ...
-
《Learninghard C#学习笔记》回馈网友,免费送书5本
前言: 在博客园园友的大力支持下,本人的第一本书<Learninghard C#学习笔记>终于出版了. 这本书是本人学习C#的亲身经历,书籍内容都是本人学习过程中认为必须掌握的内容,完全无 ...
-
PureBasic 集成Form设计器的使用
The PureBasic IDE has a very powerful integrated form designer, which allows to design easily window ...
-
C语言学习笔记之成员数组和指针
成员数组和指针是我们c语言中一个非常重要的知识点,记得以前在大学时老师一直要我们做这类的练习了,但是最的还是忘记了,今天来恶补一下. 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个 ...
-
Struct2提交表单数据到Acion
Struct2提交表单数据到Action,Action取表单的数据,传递变量.对象 HTML.jsp <form action="reg.do" method="p ...
-
Qt 5 在Windows下 出现QApplication: No such file or directory 问题的解决办法
解决方法是:在*.pro工程项目文件中添加一行QT += widgets,然后再编译运行就OK了.
-
【转】【C#】无边框窗体移动的三种方法
1. 重写WndProc protected override void WndProc(ref Message m) { const int WM_NCHITTEST = 0x84; const i ...
-
[LeetCode] Base 7 基数七
Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...
-
Weka 算法大全
关联规则挖掘 (一) Apriori (二) FilteredAssociator (三) FPGrowth (四) GeneralizedSequentislPatterns (五) Pr ...
-
ubuntu “无法获得锁 /var/lib/dpkg/lock -open”
在ubuntu系统终端下,用apt-get install 安装软件的时候,如果在未完成下载的情况下将终端中断,此时 apt-get进程可能没有结束.结果,如果再次运行apt-get install ...