Solid Dominoes Tilings (轮廓线dp打表 + 容器)
第一步先打一个表,就是利用轮廓线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's Dream 轮廓线DP 状压
Mondriaan's Dream 题目链接 Problem Description Squares and rectangles fascinated the famous Dutch painte ...
- poj2411 Mondriaan'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的骨牌, ...
随机推荐
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...
- EXPLAIN执行计划中要重点关注哪些要素(叶金荣)
原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORA ...
- 【Jmeter】if控制器+循环控制器+计数器,控制接口分支
但是我不想这么做,接口只想写一次,让循环控制器和if控制器去判断接口,执行我想要的分支.这里遇到了一个问题,if控制器通过什么去判断接下来的分支?我引入了一个计数器的概念.起始值为0,每次循环加1,将 ...
- uploadify3.2.1的参数设置
$('#file_upload').uploadify({ auto:false, //接受true 或 false两个值,当为true时选择文件后会自动上传:为false时只会把选择的文件增加进队列 ...
- React篇-报错信息:warning: Can't call setState (or forceUpdate) on an unmounted component.
报错信息是: Warning: Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but ...
- javascript篇-console.log()打印object却显示为字符串[object object]
console.log打印对象遇到的一个问题,如下截图 打印结果与预期不符,原因是因为字符串‘a’和对象object拼接在一起,拼成了一个字符串
- java -jstack
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- abap特性
1:实例成员是属于某一个对象的,静态成员属于整个类. 2:abap类中,可以定义三种不同类型的成员,分布是属性(如data),方法(method),事件(event). 3: abap中定义静态属性的 ...
- php合并数组并保留键值的方法
答案:使用 + 连接两个数组,替换array_merge()函数. php合并数组,一般会使用array_merge方法. array_merge — 合并一个或多个数组 array array_me ...
- node使用 mongoose聚合 group
var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost:27017/test", fun ...