[BZOJ2669][CQOI2012]局部最小值(容斥+状压DP)
发现最多有8个限制位置,可以以此为基础DP和容斥。
$f_{i,j}=f_{i-1,j}\times (cnt_j-i+1)+\sum_{k\subset j} f_{i-1,k}$
$cnt_j$表示当限制状态为j时i有多少个可行位置。
这样DP只能保证所有题设位置全部是局部最小值,但不保证其它位置不会变成局部最小值,容斥解决。
$O(DFS*8nm*2^8)$
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int mod=;
int dx[]={,,,-,,,-,,-},dy[]={,,,,-,,-,-,};
int n,m,ans,l,f[][<<],cnt[<<],vis[][],a[][];
char ch[][]; int dp(){
memset(f,,sizeof(f));
memset(cnt,,sizeof(cnt));
int top=;
rep(i,,n) rep(j,,m) if (ch[i][j]=='X')
a[++top][]=i,a[top][]=j;
for (int S=; S<(<<top); S++){
memset(vis,,sizeof(vis));
rep(i,,top) if (~S&(<<(i-))) vis[a[i][]][a[i][]]=;
rep(i,,n) rep(j,,m){
bool flag=;
rep(l,,) if (vis[i+dx[l]][j+dy[l]]) { flag=; break; }
if (!flag) cnt[S]++;
}
}
f[][]=;
rep(i,,n*m) for (int j=; j<(<<top); j++){
f[i][j]=(f[i][j]+1ll*f[i-][j]*max(cnt[j]-i+,))%mod;
rep(k,,top) if (j&(<<(k-)))
f[i][j]=(f[i][j]+f[i-][j^(<<(k-))])%mod;
}
return f[n*m][(<<top)-];
} void dfs(int x,int y,int t){
if (y==m+){ dfs(x+,,t); return; }
if (x==n+){ ans=(ans+dp()*(t&?-:))%mod; return; }
dfs(x,y+,t);
bool flag=;
rep(i,,) if (ch[x+dx[i]][y+dy[i]]=='X') { flag=; break; }
if (!flag) ch[x][y]='X',dfs(x,y+,t+),ch[x][y]='.';
} int main(){
freopen("bzoj2669.in","r",stdin);
freopen("bzoj2669.out","w",stdout);
scanf("%d%d",&n,&m);
rep(i,,n) scanf("%s",ch[i]+);
rep(i,,n) rep(j,,m) if (ch[i][j]=='X')
rep(k,,) if (ch[i+dx[k]][j+dy[k]]=='X') { puts(""); return ; }
dfs(,,); printf("%d\n",(ans+mod)%mod);
return ;
}
[BZOJ2669][CQOI2012]局部最小值(容斥+状压DP)的更多相关文章
- bzoj2669[cqoi2012]局部极小值 容斥+状压dp
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 774 Solved: 411[Submit][Status ...
- ARC 093 F Dark Horse 容斥 状压dp 组合计数
LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...
- bzoj3812 主旋律 容斥+状压 DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3812 题解 考虑对于图的联通性的 DP 的一般套路:总方案 - 不连通的方案. 那么我们只需要 ...
- Comet OJ - Contest #7 C 临时翻出来的题(容斥+状压)
题意 https://www.cometoj.com/contest/52/problem/C?problem_id=2416 思路 这里提供一种容斥的写法(?好像网上没看到这种写法) 题目要求编号为 ...
- 【题解】CQOI2012局部最小值
上课讲的一道题,感觉也挺厉害的~正解是容斥 + 状压dp.首先我们容易发现一共可能的局部最小值数量是十分有限的,最多也只有 \(8\) 个.所以我们可以考虑状压. 建立出状态 \(f[i][j]\) ...
- BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2669 题意概括 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所 ...
- 【bzoj2669】[cqoi2012]局部极小值 容斥原理+状压dp
题目描述 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值. 给出所有局部极小值的位置,你的任 ...
- HDU5731 Solid Dominoes Tilings 状压dp+状压容斥
题意:给定n,m的矩阵,就是求稳定的骨牌完美覆盖,也就是相邻的两行或者两列都至少有一个骨牌 分析:第一步: 如果是单单求骨牌完美覆盖,请先去学基础的插头dp(其实也是基础的状压dp)骨牌覆盖 hiho ...
- ARC093F Dark Horse 【容斥,状压dp】
题目链接:gfoj 神仙计数题. 可以转化为求\(p_1,p_2,\ldots,p_{2^n}\),使得\(b_i=\min\limits_{j=2^i+1}^{2^{i+1}}p_j\)都不属于\( ...
随机推荐
- 打印菱形(c语言)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { // 定 ...
- vim 以16进制进行文件编辑
用 vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可以按通常的编辑方式对文件进行编辑,编辑完成后再用xxd 转化为原来的形式即可. 可分如下几步进行: (1 ...
- Unix/Linux Command Reference
- mysql增删
create table msg (id int, name varchar(10)); 插入语句 insert into msg values(1,'root'); insert into msg( ...
- perl6中函数参数(2)
use v6; #如果参数是可选的, 可以在后面加个?后定义 sub Choo($x, $y?){ say $x+$y; } Choo(); Choo(,); #具名参数, 也就是字典形式的调用 su ...
- ssh日常优化使用
config文件的使用 ssh命令默认会加载 ~/.ssh/config 文件作为配置文件,如果没有则采用默认配置.如果我们想要对ssh进行定制,那么就可以使用如下方法 [root@linux-nod ...
- Call Mode feature
起源 user 在插著 充電器 打電話的狀況下, 為了安全起見, 避免 充電器在這時損害手機,間接造成 user 的傷害, 而有了這 feature, 在 battery voltage Vbat & ...
- 大原則 研讀 spec 與 code 的 心得
最近在研究 stm32f429i-disc0 的 device tree source code, 並且 參造 Devicetree Specification Release 0.1, 在 dts ...
- JQuery实现AJAX实例
<script type="text/javascript" src="ReportServer?op=emb&resource=finereport.js ...
- MyBatis3-与Spring 4集成
继续使用前一篇的例子http://www.cnblogs.com/EasonJim/p/7052368.html,实际项目中,通常会用Spring来管理DataSource等.充分利用Spring基于 ...